aaaa abab
4 3
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; const int INF=0x3f3f3f3f; const int maxn=111000; int p[maxn<<1],len; char buf[maxn],st[maxn<<1]; void init() { int i; len=strlen(buf); st[0]='$',st[1]='#'; for(i=0;i<len;i++) st[2*i+2]=buf[i],st[2*i+3]='#'; len=2*len+2; } void manacher() { int i,id,mx=0; for(i=1;i<len;i++) { p[i]=mx>i?min(mx-i,p[2*id-i]):1; while(st[i+p[i]]==st[i-p[i]])//不用担心越界。因为st[0]='$' p[i]++; if(i+p[i]>mx) mx=i+p[i],id=i; } } int main() { int i,ans; while(~scanf("%s",buf)) { ans=1; init(); manacher(); for(i=2;i<len;i++) ans=max(ans,p[i]); printf("%d\n",ans-1); } return 0; }
hdu 3068 最长回文(manacher&最长回文子串),布布扣,bubuko.com
hdu 3068 最长回文(manacher&最长回文子串)
原文地址:http://blog.csdn.net/bossup/article/details/37312047