2 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=1110000; char s[2*N],a[N]; int d[2*N],n; void get_d() { n=strlen(a+1); s[0]='$';s[2*n+1]='#'; for(int i=1;i<=n;i++)s[2*i-1]='#' ,s[2*i]=a[i]; n=2*n+1; memset(d,0,sizeof(d));d[1]=1; for(int i=2,L=1,R=1;i<=n;i++) { if(i<=R) d[i]=min(d[R-i+L],R-i+1); while( s[i-d[i]]==s[i+d[i]] ) d[i]++; if(i+d[i]-1>R) L=i-d[i]+1,R=i+d[i]-1; } } int main() { int t=0; while(scanf("%s",a+1)!=EOF) { if( strcmp(a+1,"END")==0) break; get_d(); int ans=0; for(int i=1;i<=n;i++) ans=max(d[i]-1,ans); printf("Case %d: %d\n",++t,ans); } return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=1110000; char s[2*N],a[N]; int d[2*N],n; void get_d() { n=strlen(a+1); s[0]='$';s[2*n+1]='#'; for(int i=1;i<=n;i++)s[2*i-1]='#',s[2*i]=a[i]; n=2*n+1; memset(d,0,sizeof(d));d[1]=1; for(int i=2,L=1,R=1;i<=n;i++) { if(i<=R) d[i]=min(d[R-i+L],R-i+1); while( s[i-d[i]]==s[i+d[i]] ) d[i]++; if(i+d[i]-1>R) L=i-d[i]+1,R=i+d[i]-1; } } int main() { int t=0; while(scanf("%s",a+1)!=EOF) { if( strcmp(a+1,"END")==0) break; get_d(); int ans=0; for(int i=1;i<=n;i++) ans=max(d[i]-1,ans); printf("Case %d: %d\n",++t,ans); } return 0; }
- 1
信息
- ID
- 1278
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 3
- 标签
- 递交数
- 57
- 已通过
- 30
- 上传者