hdu 3068 最长回文 manacher
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.
回文就是正反读都是一样的字符串,如aba, abba等
回文就是正反读都是一样的字符串,如aba, abba等
题目描述:中文题,不翻译。
算法分析:求解最长回文串的长度,当选O(n)的manacher算法。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<vector> 8 #define inf 0x7fffffff 9 using namespace std; 10 typedef long long LL; 11 const int maxn=110000+100; 12 char str[maxn],s[3*maxn+1000]; 13 int p[3*maxn+100],cnt; 14 void manacher() 15 { 16 int mx=0,id=0; 17 for (int i=1 ;i<cnt ;i++) 18 { 19 if (mx>i) p[i]=min(p[2*id-i],mx-i); 20 else p[i]=1; 21 for ( ;s[i+p[i] ]==s[i-p[i] ] ;p[i]++) ; 22 if (p[i]+i>mx) 23 { 24 mx=p[i]+i; 25 id=i; 26 } 27 } 28 //cout<<p[id]-1<<endl; 29 int ans=0; 30 for (int i=1 ;i<cnt ;i++) ans=max(ans,p[i]); 31 cout<<ans-1<<endl; 32 } 33 int main() 34 { 35 memset(str,0,sizeof(str)); 36 while (scanf("%s",str)!=EOF) 37 { 38 cnt=0; 39 memset(s,0,sizeof(s)); 40 memset(p,0,sizeof(p)); 41 s[cnt++]='$'; 42 int len=strlen(str); 43 for (int i=0 ;i<len ;i++) 44 { 45 s[cnt++]='#'; 46 s[cnt++]=str[i]; 47 } 48 s[cnt++]='#'; 49 s[cnt]=0; 50 manacher(); 51 } 52 return 0; 53 }