POJ 3974 Palindrome 字符串 Manacher算法
Posted 鲸头鹳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3974 Palindrome 字符串 Manacher算法相关的知识,希望对你有一定的参考价值。
http://poj.org/problem?id=3974
模板题,Manacher算法主要利用了已匹配回文串的对称性,对前面已匹配的回文串进行利用,使时间复杂度从O(n^2)变为O(n)。
https://www.cnblogs.com/xiaoningmeng/p/5861154.html 详细解释
https://www.zhihu.com/question/30226229 这是复杂度O(n)的解释
代码
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #include<iostream> 6 #include<map> 7 #include<ctime> 8 using namespace std; 9 const int maxn=1000010; 10 char c[maxn]; 11 char s[maxn*2]; 12 int p[maxn*2]; 13 int len; 14 void init(){ 15 len=strlen(c); 16 int j=1; 17 s[0]=\'$\';s[1]=\'#\'; 18 for(int i=0;i<len;i++){ 19 s[++j]=c[i]; 20 s[++j]=\'#\'; 21 }s[++j]=\'\\0\'; 22 len=j; 23 } 24 int Manacher(){ 25 init();int ans=1; 26 int id,mx=0; 27 for(int i=1;i<len;i++){ 28 if(i<mx) p[i]=min(p[2*id-i],mx-i); 29 else p[i]=1; 30 while(s[i-p[i]]==s[i+p[i]]) 31 p[i]++; 32 if(mx<i+p[i]){ 33 id=i; 34 mx=i+p[i]; 35 } 36 ans=max(ans,p[i]); 37 } 38 return ans-1; 39 } 40 int main(){ 41 for(int i=1;;++i){ 42 scanf("%s",&c); 43 if(c[0]==\'E\')break; 44 printf("Case %d: %d\\n",i,Manacher()); 45 } 46 return 0; 47 }
以上是关于POJ 3974 Palindrome 字符串 Manacher算法的主要内容,如果未能解决你的问题,请参考以下文章