QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#379808 | #8571. Palworld | ucup-team1447# | AC ✓ | 3397ms | 146376kb | C++23 | 4.9kb | 2024-04-06 19:15:00 | 2024-04-06 19:15:00 |
Judging History
answer
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <assert.h>
#include <math.h>
#include <set>
#include <vector>
using std::min;
#define od(x) printf("%lld",x)
#define odb(x) printf("%lld ",x)
#define odl(x) printf("%lld\n",x)
#define odp(x,y) printf("%lld %lld\n",x,y)
using pi=std::pair<int,int>;
using vi=std::vector<int>;
using vpi=std::vector<pi>;
const int mod=998244353;
#define x first
#define y second
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
inline int read()
{
int num=0,f=1;char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)num=num*10+(c^48),c=getchar();
return num*f;
}
void mae(int &x,int y){x=x+y;if(x>=mod)x-=mod;}
int me(int x,int y){return x*y%mod;}
void mxe(int &a,int b){if(a<b)a=b;}
int sa[1234567],rk[1234567];
pi tmp[1234567],vv[1234567];
int sz[1234567],tk[1234567],od[1234567],pk[1234567],height[1234567];
char a[1234567];
vpi g[1234567];
void SA(char *t,int n)
{
for(int i=1;i<=max(n*2,1000);i++)
sa[i]=rk[i]=tmp[i].first=tmp[i].second=vv[i].first=vv[i].second
=sz[i]=tk[i]=od[i]=pk[i]=height[i]=0;
for(int i=1;i<=n;i++)t[i]-=96;
memset(rk,0,sizeof(rk));
for(int i=1;i<=n;i++)rk[i]=t[i];
int Q=std::max(n,200);
for(int j=1;j<=n;j<<=1)
{
//sort by 2k
for(int i=0;i<=Q;i++)sz[i]=0;
for(int i=1;i<=n;i++)sz[rk[j+i]+1]++;
for(int i=1;i<=Q;i++)sz[i]+=sz[i-1];
for(int i=1;i<=n;i++)tk[++sz[rk[j+i]]]=i;
//sort by 1k
for(int i=0;i<=Q;i++)sz[i]=0;
for(int i=1;i<=n;i++)sz[rk[i]+1]++;
for(int i=1;i<=Q;i++)sz[i]+=sz[i-1];
for(int i=1;i<=n;i++)od[++sz[rk[tk[i]]]]=tk[i];
for(int i=1;i<=n;i++)
{
int x=od[i],y=od[i-1];
if(i==1||rk[x]!=rk[y]||rk[x+j]!=rk[y+j])pk[i]=1;
else pk[i]=0;
}
for(int i=1;i<=n;i++)rk[od[i]]=rk[od[i-1]]+pk[i];
}
for(int i=1;i<=n;i++)sa[rk[i]]=i;
for(int i=0,k=0;i<n;i++)
{
if(rk[i]==0)continue;
if(k)k--;
int j=sa[rk[i]-1];
while(j+k<=n&&i+k<=n&&t[i+k]==t[j+k])k++;
height[rk[i]]=k;
if(i&&j)g[k].push_back({i,j});
}
}
#define sz szsz
#define mgs int fa[1<<22],sz[1<<22];\
inline int f(int x){return x==fa[x]?x:fa[x]=f(fa[x]);}\
inline int uf(int x,int y)\
{\
int fx=f(x),fy=f(y);\
if(fx==fy)return 0;\
if(sz[fx]>sz[fy])fx^=fy^=fx^=fy;\
fa[fx]=fy,sz[fy]+=sz[fx];\
return 1;\
}
mgs
struct STmin{
int a[21][1000005],n;
void build(int N,int *b)
{
n=N;
for(int i=1;i<=n;i++)a[0][i]=b[i];
for(int i=1;i<=20;i++)
for(int j=1;j<=n-(1<<i)+1;j++)
a[i][j]=min(a[i-1][j],a[i-1][j+(1<<i-1)]);
}
int q(int l,int r)
{
int d=std::__lg(r-l+1);
return min(a[d][l],a[d][r-(1<<d)+1]);
}
};
STmin st;
int lcp(int l,int r)
{
if(l==r)return 1145141;
l=rk[l],r=rk[r];
if(l>r)std::swap(l,r);
return st.q(l+1,r);
}
int n,k;
int get(int x,int y){
if(x<1||x>n||y<1||y>n)return 0;
int mx=min(n-x+1,y);
return min(lcp(x,2*n+1-y),mx);
}
int L[400005][2],R[400005][2];
signed main()
{
int T=read();while(T--){
n=read(),k=read();
scanf("%s",a+1);
for(int i=1;i<=n;i++)a[n+n+1-i]=a[i];
// puts(a+1);
SA(a,n+n);
st.build(n+n,height);
// for(int i=1;i<=n;i++,puts(""))
// for(int j=1;j<=n;j++)
// printf("%d ",i==j?0:lcp(i,j));
// printf("lcp=%d\n",lcp(3,6));
// for(int i=1;i<=n*2;i++)printf("%d ",rk[i]);puts("");
// for(int i=1;i<=n*2;i++)printf("%d ",height[i]);puts("");
for(int i=2;i<=2*n;i++)
for(int j=0;j<=1;j++)
{
if(i%2==0)L[i][j]=R[i][j]=i/2;
else L[i][j]=i/2+1,R[i][j]=i/2;
}
int res=0;
for(int j=0;j<=0;j++)
for(int i=2;i<=n*2;i++)
{
int len=get(R[i][j]+1,L[i][j]-1);
L[i][j]-=len,R[i][j]+=len;
// printf("%d %d : [%d %d]\n",i,j,L[i][j],R[i][j]);
int _=i;
if(j==0)
{
for(int z=1;z<=k;z++)
{
int l=L[i][j],r=R[i][j]+z;
if(r<=n)
{
res=max(res,r-l+1+z+2*get(r+1,l-1));
// if(r-l+1+i+get(r+1,l-1)==13)
// {
// printf("_,i=%d %d l,r=%d %d\n",_,i,l,r);
// }
// L[l+r][j+1]=min(L[l+r][j+1],l);
// R[l+r][j+1]=max(R[l+r][j+1],r);
}
l=L[i][j]-z,r=R[i][j];
if(l>=1)
{
res=max(res,r-l+1+z+2*get(r+1,l-1));
// L[l+r][j+1]=min(L[l+r][j+1],l);
// R[l+r][j+1]=max(R[l+r][j+1],r);
}
}
}
// if(R[i][j]!=n)
// {
// int l=L[i][j],r=R[i][j]+1;
// L[l+r][j+1]=min(L[l+r][j+1],l);
// R[l+r][j+1]=max(R[l+r][j+1],r);
// }
// if(L[i][j]!=1)
// {
// int l=L[i][j]-1,r=R[i][j];
// L[l+r][j+1]=min(L[l+r][j+1],l);
// R[l+r][j+1]=max(R[l+r][j+1],r);
// }
res=max(res,R[i][j]-L[i][j]+1+k);
}
for(int z=1;z<=k;z++)
{
for(int l=1,r=z;r<=n;l++,r++)
{
res=max(res,z+k+2*get(r+1,l-1));
// printf("[%d %d]:%d\n",l,r,z+k+2*get(r,l));
}
}
printf("%d\n",res);
}
}
这程序好像有点Bug,我给组数据试试?
詳細信息
Test #1:
score: 100
Accepted
time: 3ms
memory: 40660kb
input:
4 1 3 a 4 1 icpc 4 2 icpc 8 4 icecream
output:
4 5 5 11
result:
ok 4 number(s): "4 5 5 11"
Test #2:
score: 0
Accepted
time: 727ms
memory: 133804kb
input:
1 200000 66 jsmwjmibgkjvdscqllsxpaxiycmpauhnzschbivtqbjfrxrqvhvfbqecozjewqqpwdfbeqppjkgxhbnniopkptkygspcdswhwadfwhnzovvpshgcdukrupeztkpxwhmctaquqbxtidzbbxsyuaeikuldaoeudletrsmqptaejibkymsjhmwykqsjdvvdaqwelrcpxwrwhuvodipjniowfofbjktkdezwqqbvwsppsmpilntmdmlxgkaxymnugmmcsljkjzjuudnllydwdwwanadynsoiolso...
output:
141
result:
ok 1 number(s): "141"
Test #3:
score: 0
Accepted
time: 984ms
memory: 132068kb
input:
1 200000 100 qhiaajzxinenucrnfffumuhnovpuwcnojbhsktztapgyivmfqrlntwazwnfetwqieckxcnkskpidltiydfoveaucckximydxxfbiwbdufmbhywqkflyqxbijakadqkzftlciccbpnldsqhtjxuxnvkusvizavuyfhdroiuominebadhfqzrpjnzpgyvkejfwmueiltyeqpvwrkanqknyacqganbszktocfuvvsfrboaennwpaabfdnaurvvurysrijnfaonesihbhrrvbvyhpbremsuhhbc...
output:
209
result:
ok 1 number(s): "209"
Test #4:
score: 0
Accepted
time: 1691ms
memory: 46444kb
input:
10000 21 7 fhcjhdjcfbfbdeeheibhg 18 8 hccgjfaadefhjhcijc 15 7 ahefiiheaigjiid 15 3 fgjjebidbfgbdij 15 5 jccebbgjbhifjhb 20 2 hcbddhibgfccjjcfebcc 19 1 ehbdgiicchijebidbcd 20 8 gbcfghefhbjggecdhcbj 17 2 jjaeaccjbcfiehfdd 23 4 iafjedfbebbhcfgfjbehdaf 22 1 jgiiiaacehcbaiehfggcfi 17 2 jefbbfigfhbhfcici ...
output:
17 21 17 11 13 9 6 18 9 11 6 9 22 8 21 23 5 23 7 16 9 23 25 11 17 12 9 5 20 5 23 12 7 13 16 17 21 21 21 12 16 21 21 8 9 11 21 15 5 24 13 7 21 13 11 8 7 19 25 7 8 12 13 22 15 14 7 15 7 20 15 13 11 15 5 11 23 17 17 19 15 7 19 17 25 13 23 10 17 21 9 21 7 23 21 13 16 7 14 10 13 10 9 11 7 21 15 19 11 23 ...
result:
ok 10000 numbers
Test #5:
score: 0
Accepted
time: 252ms
memory: 146376kb
input:
1 200000 100 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
200100
result:
ok 1 number(s): "200100"
Test #6:
score: 0
Accepted
time: 754ms
memory: 143032kb
input:
1 200000 73 jgqahsycxmrrwvszqigkxmxxckratkgiyyqbxgjzaqkufvkgmepixhjdugpsntlsgtiedueukiytrytrcvlkymwibsfdhytbffmtaytnfczbavrrbdnpegwxubyeoopzopqhrwukohojtaizsureefffglwjfawvpqqnjteveuscyelgjiukskvymqejzwlnrjgvnpwnttzahoupruedryqeyahxgltnibxhbpxmhxxnmrebsgbjwsfpipezkekaqptnwtuanbfyfwyotwkrvlamnuvhunty...
output:
175682
result:
ok 1 number(s): "175682"
Test #7:
score: 0
Accepted
time: 1672ms
memory: 46076kb
input:
10000 12 1 jelwdrimpvtq 19 8 qcogumialfqhaahfhtb 11 12 tbnfsiqbibv 5 4 hdehb 4 1 ivxi 7 8 nonrwqa 14 16 obvpfqjekvmnyq 4 5 fzhi 18 17 gploorpjnrrhcrgxlp 2 3 pf 7 9 uiliuyr 1 3 v 3 3 bgj 9 4 tektrwtmk 10 4 vvkvbzpbye 20 5 jqzqpqiwkssksbilayvj 2 4 kl 5 2 vptsk 20 9 kuiwsxhfmirnrhzuysqd 8 8 aairrgjl 15...
output:
3 20 23 9 5 15 30 9 35 5 16 4 6 11 11 14 6 5 21 16 13 11 2 23 13 3 30 5 23 15 21 16 18 21 3 3 11 23 13 13 8 14 4 22 6 5 13 3 18 27 9 3 24 32 28 3 13 3 31 18 3 7 8 3 15 20 7 13 19 15 3 7 3 15 12 4 7 29 5 3 11 36 23 5 26 22 11 8 12 30 7 9 25 11 3 3 9 12 15 22 10 2 17 15 21 7 31 33 7 35 18 31 11 10 10 ...
result:
ok 10000 numbers
Test #8:
score: 0
Accepted
time: 3397ms
memory: 43632kb
input:
20480 1 1 d 1 2 d 1 1 z 1 2 z 2 1 pp 2 2 pp 2 3 pp 2 1 zp 2 2 zp 2 3 zp 2 1 pz 2 2 pz 2 3 pz 2 1 zz 2 2 zz 2 3 zz 3 1 www 3 2 www 3 3 www 3 4 www 3 1 mww 3 2 mww 3 3 mww 3 4 mww 3 1 wmw 3 2 wmw 3 3 wmw 3 4 wmw 3 1 mmw 3 2 mmw 3 3 mmw 3 4 mmw 3 1 wwm 3 2 wwm 3 3 wwm 3 4 wwm 3 1 mwm 3 2 mwm 3 3 mwm 3 ...
output:
2 3 2 3 3 4 5 3 4 5 3 4 5 3 4 5 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 4 5 6 7 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 4 6 7 8 9 5 6 7 8 9 5 5 7 8 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 5 5 7 8 9 5 6 7 8 9 4 6 7 8 9 5 6 7 8 9 5 6 7 8 9 5 6 7 8 9 6 7 8 9 10 11 6 7 8 9 10 11 6 7 8 9 10 11 5 ...
result:
ok 20480 numbers
Test #9:
score: 0
Accepted
time: 602ms
memory: 51636kb
input:
2000 88 14 hbwgbmjtqmgdpbgsdkjndhwjrhluountepcjpecnaogiamrzmnomjcgzzvdrzsfjspyxpooxhjtzlqtzvpeydwap 104 88 osirzoiablktpnobqvhckmttlpbgaeakzhemoxgteqbkmfzaerhqfwkoqpsiqqymmbmufxhvfhovkhdduzybzzhqnvbmswqepkqzrkox 82 25 rumtzeygumtvcmyiowwmxkjekajxpubgazyxabibdirnbsmzsjawtaksrydmuroohkrrajlqqyxogtvuul...
output:
31 177 53 71 113 9 153 107 97 51 149 153 121 193 111 38 129 175 99 183 91 183 115 182 203 41 193 155 159 11 149 145 111 19 76 152 67 107 79 15 49 175 149 63 115 59 45 39 138 37 102 14 23 157 75 175 31 33 65 95 171 61 59 34 73 107 195 185 113 11 65 16 128 184 59 139 23 131 115 135 143 166 42 34 49 29...
result:
ok 2000 numbers
Test #10:
score: 0
Accepted
time: 1008ms
memory: 132072kb
input:
1 200000 100 cbdadabcbdaaacbedaccdeeeaabececdbcdebcedaeacddcdeaacaccedeadecacaabbdbdbbbbbeaecddbcaaeeaddcabcbebecebcddeccaeceacdebecaddcaddaaadaecabcbbbababedbbccbaceadaeccbbceaeacdccaaaabcbdaebcbcacaaeebebdddeeeeddcaaadbbbccacecacccebeeaabaecbdeccccbdbeedcddececabeaadeaadadcccbeebaecbacbccdbaceebdb...
output:
222
result:
ok 1 number(s): "222"
Test #11:
score: 0
Accepted
time: 967ms
memory: 131840kb
input:
1 200000 100 bcacdaadcdbcaeeebacabdaadebbceabaacdebddeacdebaabdccacdcacadbceceecdccebdebdbccdadbebbaebcabeddeabbdebdadcdedaadedbccbbdbcccdceddeadccdaadeecbebddcddccccbebccbbadaaadeeabaedecdacbeaabadcdeaeddadecdeddbeedeccaabaeebebdbecceaecbdcebceaadeebeaaceadebedcbdbdbcdbbecabddecabcdbccbbbecdaceabdd...
output:
220
result:
ok 1 number(s): "220"
Extra Test:
score: 0
Extra Test Passed