标签:
Manacher算法能够在O(N)的时间复杂度内得到一个字符串以任意位置为中心的回文子串。其算法的基本原理就是利用已知回文串的左半部分来推导右半部分。
例题:HDU 3068
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 const int N=110005; 6 char s[N],cpy[N<<1]; 7 int rad[N<<1]; 8 void manacher(char *s,int len,int rad[]) 9 { 10 for(int i=1,j=0,k;i<len;i+=k) 11 { 12 while(s[i-j-1]==s[i+j+1]) j++;//扫描出当前rad 13 rad[i]=j; 14 for(k=1;k<=rad[i]&&rad[i-k]!=rad[i]-k;k++)//通过前半部分推出后半部分 15 rad[i+k]=min(rad[i-k],rad[i]-k); 16 j=max(j-k,0);//更新 17 } 18 } 19 void work(char *s,int rad[]) 20 { 21 //预处理 22 int len=strlen(s); 23 cpy[0]=‘(‘;cpy[1]=‘#‘; 24 for(int i=0,j=2;i<len;i++,j+=2) 25 { 26 cpy[j]=s[i]; 27 cpy[j+1]=‘#‘; 28 } 29 cpy[(len=2*len+3)-1]=‘)‘; 30 manacher(cpy,len,rad); 31 int ans=1; 32 for(int i=0;i<len;i++) 33 ans=max(ans,rad[i]); 34 printf("%d\n",ans); 35 } 36 int main() 37 { 38 while(scanf("%s",s)!=EOF) 39 { 40 work(s,rad); 41 } 42 return 0; 43 }
参考文章:http://www.cnblogs.com/Lyush/p/3221503.html
标签:
原文地址:http://www.cnblogs.com/L-King/p/5450472.html