QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#379367 | #8571. Palworld | ucup-team266# | TL | 612ms | 54332kb | C++14 | 2.4kb | 2024-04-06 17:18:13 | 2024-04-06 17:18:14 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
char c[401000],c_[400100];
int p[401000],lg[401000];
namespace opj{
int rk[1001000],sa[1010000],m,t[1001000],tr[1001000],h[401000],st[20][401000];
void SA(int n){
m=128;
for(int i=1;i<=m;i++)t[i]=0;
for(int i=1;i<=n;i++)t[rk[i]=c[i]]++;
for(int i=1;i<=m;i++)t[i]+=t[i-1];
for(int i=n;i;i--)sa[t[rk[i]]--]=i;
for(int k=1;;k<<=1){
int p=0;
for(int i=n-k+1;i<=n;i++)tr[++p]=i;
for(int i=1;i<=n;i++)if(sa[i]>k)tr[++p]=sa[i]-k;
for(int i=1;i<=m;i++)t[i]=0;
for(int i=1;i<=n;i++)t[rk[i]]++;
for(int i=1;i<=m;i++)t[i]+=t[i-1];
for(int i=n;i;i--)sa[t[rk[tr[i]]]--]=tr[i];
swap(tr,rk),rk[sa[1]]=p=1;
for(int i=2;i<=n;i++)rk[sa[i]]=(tr[sa[i-1]]==tr[sa[i]]&&tr[sa[i-1]+k]==tr[sa[i]+k])?p:++p;
if(n==p)break;m=p;
}
for(int i=1,k=0;i<=n;i++){
if(k)k--;int j=sa[rk[i]-1];
while(i+k<=n&&j+k<=n&&c[i+k]==c[j+k])k++;
st[0][rk[i]]=k;
}
for(int j=1;j<20;j++)for(int i=1;i+(1<<j)-1<=n;i++)
st[j][i]=min(st[j-1][i],st[j-1][i+(1<<(j-1))]);
}
inline int lcp(int x,int y){
x=rk[x],y=rk[y];if(x>y)swap(x,y);x++;
int k=lg[y-x+1];
return min(st[k][x],st[k][y-(1<<k)+1]);
}
}
int n,m;
int sol(){
for(int i=1;i<=n;i++)c[n*2+1-i]=c[i];
opj::SA(n*2);
c_[0]='?',c_[1]='#';
for(int i=1;i<=n;i++)c_[i*2]=c[i],c_[i*2+1]='#';
c_[n*2+2]='!';
for(int i=0;i<=n*2+2;i++)p[i]=0;
int ans=m+min(n,m);
for(int i=1,mx=0,id=0;i<=n*2+1;i++){
if(i<=mx)p[i]=min(mx-i+1,p[2*id-i]);
while(c_[i+p[i]]==c_[i-p[i]])p[i]++;
if(i+p[i]-1>mx)mx=i+p[i]-1,id=i;
ans=max(ans,p[i]-1);
if(!(i&1)){
int e=p[i]/2,L=i/2-e,R=i/2+e;
for(int j=1;j<=m&&R+j<=n+1;j++){
int lc=0;
if(L&&R+j<=n)lc=min(opj::lcp(R+j,n*2+1-L),n+1-(R+j));
ans=max(ans,p[i]-1+(lc+j)*2);
}
for(int j=1;j<=m&&j<=L;j++){
int lc=0;
if(j<L&&R<=n)lc=min(opj::lcp(R,n*2+1-(L-j)),n+1-R);
ans=max(ans,p[i]-1+(lc+j)*2);
}
}
else{
int e=p[i]/2,L=i/2-e,R=(i+1)/2+e;
for(int j=1;j<=m&&R+j<=n+1;j++){
int lc=0;
if(L&&R+j<=n)lc=min(opj::lcp(R+j,n*2+1-L),n+1-(R+j));
ans=max(ans,p[i]-1+(lc+j)*2);
}
}
}
return ans;
}
void soll(){
scanf("%d%d%s",&n,&m,c+1);
int ans=sol();
for(int i=2;i<=n;i++)for(int j=i;j<n&&j-i+1<=m;j++)
ans=max(ans,min(opj::lcp(j+1,n*2+2-i),n-j)*2+j-i+1+m);
printf("%d\n",ans);
}
int main(){
lg[0]=-1;
for(int i=1;i<=400000;i++)lg[i]=lg[i>>1]+1;
int T;scanf("%d",&T);while(T--)soll();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 8ms
memory: 24232kb
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: 449ms
memory: 54332kb
input:
1 200000 66 jsmwjmibgkjvdscqllsxpaxiycmpauhnzschbivtqbjfrxrqvhvfbqecozjewqqpwdfbeqppjkgxhbnniopkptkygspcdswhwadfwhnzovvpshgcdukrupeztkpxwhmctaquqbxtidzbbxsyuaeikuldaoeudletrsmqptaejibkymsjhmwykqsjdvvdaqwelrcpxwrwhuvodipjniowfofbjktkdezwqqbvwsppsmpilntmdmlxgkaxymnugmmcsljkjzjuudnllydwdwwanadynsoiolso...
output:
141
result:
ok 1 number(s): "141"
Test #3:
score: 0
Accepted
time: 612ms
memory: 54292kb
input:
1 200000 100 qhiaajzxinenucrnfffumuhnovpuwcnojbhsktztapgyivmfqrlntwazwnfetwqieckxcnkskpidltiydfoveaucckximydxxfbiwbdufmbhywqkflyqxbijakadqkzftlciccbpnldsqhtjxuxnvkusvizavuyfhdroiuominebadhfqzrpjnzpgyvkejfwmueiltyeqpvwrkanqknyacqganbszktocfuvvsfrboaennwpaabfdnaurvvurysrijnfaonesihbhrrvbvyhpbremsuhhbc...
output:
209
result:
ok 1 number(s): "209"
Test #4:
score: -100
Time Limit Exceeded
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 7 21 23 5 23 7 16 9 23 25 11 17 12 9 5 19 5 23 12 7 13 16 17 21 21 21 11 16 21 21 8 9 11 21 15 5 24 13 7 21 13 11 7 7 19 25 7 8 12 13 22 15 14 7 15 7 19 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 15 7 14 10 13 10 9 11 7 21 15 19 11 23 ...