Manacher 线性时间求最长回文串

来源:互联网 发布:json乱码转换成中文 编辑:程序博客网 时间:2024/05/16 02:49
#include<bits/stdc++.h>#define REP(i,j,k) for (i=(j);i<=(k);++i)#define max(x,y) ((x)>(y)?(x):(y))#define min(x,y) ((x)<(y)?(x):(y))using namespace std;const int dmax=100100;char s[dmax];int f[dmax];int main(){int i,j,k,m,n=0;s[0]='$';while (1){s[++n]=getchar();if (s[n]=='\n'){s[n]='$';break;}s[++n]='$';}int mx,l,ans=0;mx=l=0;REP(i,1,n){if (mx>i){f[i]=min(f[2*l-i],mx-i);}elsef[i]=1;while (s[i-f[i]]==s[i+f[i]]) ++f[i];if (f[i]+i>mx){mx=f[i]+i;l=i;}ans=max(ans,f[i]);}ans--;printf("%d\n",ans);return 0;}
0 0