aaaa abab
4 3
主要是練習下。php
manacher算法解說見herehtml
p[i]-1爲原迴文串的長度。ios
#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; } 算法