马拉车模板题
题目代码
#include<iostream> #include<stdio.h> #include<string.h> #include<vector> using namespace std; typedef long long LL; const int maxn=110007; char str[maxn],res[maxn*2]; int p[maxn*2]; int Manacher(char *s){ int len=strlen(s); int maxlen=0; int right=0,mid=0; for(int i=0;i<len;i++){ res[i*2+2]=str[i]; res[i*2+3]='#'; } res[0]='$',res[1]='#'; for(int i=1;i<len*2+2;i++){ p[i]=right>i?min(right-i,p[mid*2-i]):1; while(res[i+p[i]]==res[i-p[i]]) p[i]++; if(i+p[i]>right){ right=i+p[i]; mid=i; } if(p[i]>maxlen){ maxlen=p[i]; } }return maxlen-1; } int main(){ while(~scanf("%s",str)){ printf("%d ",Manacher(str)); } return 0; }