马拉车
相当简单好写,话说这个板子我写了很久了今天懒得再敲直接
1 //马拉车(manacher)算法是求字符串内最大回文子串的算法,时间复杂度为线性 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cmath> 7 #include <algorithm> 8 #include <iostream> 9 #include <stack> 10 #include <queue> 11 #define N (100000+5) 12 #define oo 2147483647 13 using namespace std; 14 char a[N],f[N<<1]; 15 int len[N<<1],slen; 16 void init(){ 17 cin>>a; 18 slen=strlen(a); 19 f[0]='@'; 20 for(int i=1;i<=2*slen;i+=2){ 21 f[i]='#'; 22 f[i+1]=a[i/2]; 23 } 24 f[2*slen+1]='#'; 25 f[2*slen+2]='$'; 26 } 27 void manacher(){ 28 int mx=0,id=0,ans=0; 29 for(int i=1;i<=2*slen;i++){ 30 if(mx>i){ 31 len[i]=min(mx-i,len[2*id-i]); 32 } 33 else{ 34 len[i]=1; 35 } 36 while(f[i+len[i]]==f[i-len[i]]){ 37 len[i]++; 38 } 39 if(mx<len[i]+i){ 40 mx=len[i]+i; 41 id=i; 42 } 43 if(ans<len[i]){ 44 ans=len[i]; 45 } 46 } 47 cout<<ans-1<<endl; 48 } 49 int main(){ 50 freopen("txt.in","r",stdin); 51 freopen("txt.out","w",stdout); 52 init(); 53 manacher(); 54 return 0; 55 }
贴上来吧

浙公网安备 33010602011771号