HDU 3068 最長回文(manacher模板題)
阿新 • • 發佈:2018-03-04
style hdu log pre using ret algo names print
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3068
題目大意:求字符串s中最長的回文子串
解題思路:manacher模板
代碼
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int N=1e6+5; 7 8 int len1,len2; 9 int p[N]; 10 char s[N],str[N];11 12 void init(){ 13 str[0]=‘$‘; 14 str[1]=‘#‘; 15 for(int i=0;i<len1;i++){ 16 str[i*2+2]=s[i]; 17 str[i*2+3]=‘#‘; 18 } 19 len2=len1*2+2; 20 str[len2]=‘%‘; 21 } 22 23 void manacher(){ 24 int id=0,mx=0; 25 for(int i=1;i<len2;i++){ 26 if(mx>i) p[i]=min(p[2*id-i],mx-i); 27 else p[i]=1; 28 while(str[i+p[i]]==str[i-p[i]]) 29 p[i]++; 30 if(p[i]+i>mx){ 31 mx=p[i]+i; 32 id=i; 33 } 34 } 35 } 36 37 int main(){ 38 while(~scanf("%s",s)){ 39 len1=strlen(s);40 init(); 41 manacher(); 42 int ans=0; 43 for(int i=0;i<len2;i++){ 44 ans=max(ans,p[i]); 45 } 46 printf("%d\n",ans-1); 47 } 48 return 0; 49 }
HDU 3068 最長回文(manacher模板題)