http://acm.hdu.edu.cn/showproblem.php?pid=3068
新学的算法,求回文串用Manacher算法
讲解:http://acm.uestc.edu.cn/bbs/simple/?t3258.html
View Code
#include <iostream> using namespace std ; const int N=110001 ; int len ; int p[N<<1] ; char s[N],str[N<<1] ; void Manacher() { int mx=0 ; int id ; for(int i=1;i<len;i++) { if(mx>i) p[i]=min(p[(id<<1)-i],mx-i) ; else p[i]=1 ; for(;str[i+p[i]]==str[i-p[i]];p[i]++) ; if(p[i]+i>mx) { mx=p[i]+i ; id=i ; } } } int main() { while(~scanf("%s",s)) { len=strlen(s) ; str[0]='$' ; str[1]='#' ; for(int i=0;i<len;i++) { str[(i<<1)+2]=s[i] ; str[(i<<1)+3]='#' ; } len=(len<<1)+2 ; str[len]='\0' ; Manacher() ; int ans=-1 ; for(int i=0;i<len;i++) ans=max(ans,p[i]) ; printf("%d\n",ans-1) ; } return 0 ; }