题目大意:给出一个长度不大于2e6的字符串,求最长回文串长度。
人话:敲一遍manacher板子。
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 2000050 char s[N],l[2*N]; int p[N],len; int manacher() { for(int i=1;i<=len;i++) p[i]=0; l[0]='!',l[1]='#'; for(int i=1;i<=len;i++) { l[i<<1]=s[i]; l[i<<1|1]='#'; } l[(len<<1)+2]='*'; int mx = 0,mid = 0,ret = 0; for(int i=1;i<=2*len+1;i++) { if(i<mx)p[i]=min(mx-i+1,p[mid*2-i]); else p[i]=1; while(l[i+p[i]]==l[i-p[i]])p[i]++; if(i+p[i]-1>mx) { mx=i+p[i]-1; mid = i; } ret = max(ret,p[i]-1); } return ret; } int main() { int n = 0; while(scanf("%s",s+1)) { len = strlen(s+1); if(s[1]=='E'&&s[2]=='N'&&s[3]=='D'&&len==3)break; n++; printf("Case %d: %d ",n,manacher()); } return 0; }