manecher_回文串;
求回文串的o(n)算法,实质是对称;
放个链接:https://segmentfault.com/a/1190000003914228
这篇文章讲的很不错;
摘自上述文章:
..........................算了泥懣自己点开看吧;
求最大回文串代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 char s[1000000]; 4 char ss[1000000]; 5 int p[1000000]; 6 int id,mx; 7 int k; 8 void manacher(char *s) 9 { 10 int n=k; 11 //for(int i=0;i<n;i++)cout<<s[i]<<' '; 12 id=0;mx=0; 13 for(int i=1;i<n;i++) 14 { 15 if(mx>i)p[i]=min(p[2*id-i],mx-i); 16 else p[i]=1; 17 while(s[i-p[i]]==s[i+p[i]])p[i]++; 18 } 19 int idx=0,lo=0; 20 for(int i=0;i<n;i++) 21 {if(p[i]>lo)lo=p[i],idx=i; 22 // cout<<p[i]<<' '; 23 } 24 for(int i=idx-p[idx]+1;i<idx+p[idx]-1;i++) 25 { 26 if(s[i]!='!')cout<<s[i]; 27 } 28 cout<<endl; 29 return ; 30 }//12212321 31 int main() 32 { 33 scanf("%s",&s); 34 int p=0; 35 for(int i=0;i<strlen(s);i++) 36 ss[p++]='!',ss[p++]=s[i]; 37 ss[p++]='!'; 38 k=p; 39 manacher(ss); 40 return 0; 41 }
很简洁使用的算法;