1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include<iostream> #include<cstring> #include<algorithm> const int MAX=110005; char s1[MAX]; char s[2*MAX+2]; int d[2*MAX+2]; using namespace std; int main() { while(cin>>s1) { memset(d,0,sizeof(d)); memset(s,0,sizeof(s)); int ans=1; int len=strlen(s1); s[0]='&'; for(int i=1;i<=2*len+1;i+=2) { s[i]='#'; } int k=0; for(int i=2;i<=2*len;i+=2) { s[i]=s1[k++]; }
int id=0,mx=0; d[0]=1;d[1]=1;d[2]=2; id=2;mx=id+d[id]; for(int i=3;s[i]!='\0';i++) { int j=2*id-i; if(i<mx) { if(d[j]<mx-i) { d[i]=d[j]; } else { d[i]=mx-i; } } else d[i]=1;
while(s[i+d[i]]==s[i-d[i]]) d[i]++; if(i+d[i]>mx) { mx=i+d[i]; id=i; } if(d[i]-1>ans) ans=d[i]-1; } cout<<ans<<endl; } }
|