hdu3068最长回文(manacher算法)
经典的找最长回文字串问题。最快的算法就是manacher(马拉车)算法,可以O(n)出结果。详情见这篇文章。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<list> #include<deque> #include<vector> #include<algorithm> #include<stack> #include<queue> #include<cctype> #include<sstream> using namespace std; #define pii pair<int,int> #define LL long long int const double eps=1e-10; const int INF=1000000000; const int maxn=110000+10; char s[maxn],s2[maxn<<1]; int p[maxn<<1]; int main() { //freopen("in2.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%s",&s[1])!=EOF) { int i; memset(p,0,sizeof(p)); for(i=1;s[i]!='\0';i++) { s2[i<<1]=s[i]; s2[i<<1|1]='#'; } s2[1]='#'; s2[0]='*'; int wid=0,id=1; int n=2*i+2; int ans=0; for(int j=2;j<n;j++) { if(j<wid) { p[j]=min(p[2*id-j],wid-j); /*注意这里不是wid-j+1,因为按之前以id为中心的比较, 在id+wid处已经开始不回文了。这里s2[id+wid]必须 参与新的比较。 */ } else { p[j]=1; } for(;s2[j-p[j]]==s2[j+p[j]];p[j]++); if(j+p[j]>wid) { wid=j+p[j]; id=j; } if(ans<p[j]-1) { ans=p[j]-1; } } printf("%d\n",ans); } //fclose(stdin); //fclose(stdout); return 0; }