马拉车算法
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int maxn=100100; 9 int n,siz; 10 char ch[maxn]={}; 11 char ch1[maxn*2]={}; 12 int p[maxn*2]={}; 13 void fir(){ 14 siz=n*2+2; 15 ch1[0]=‘$‘;ch1[1]=‘#‘; 16 for(int i=1;i<=n;i++)ch1[i*2]=ch[i-1],ch1[i*2+1]=‘#‘; 17 ch1[siz]=‘\0‘; 18 } 19 int Manacher(){ 20 fir();int x=0,j=0,ans=0; 21 for(int i=1;i<siz;i++){ 22 if(x+j>i)p[i]=min(x+j-i+1,p[x*2-i]); 23 else p[i]=0; 24 while(ch1[i+p[i]]==ch1[i-p[i]])p[i]++; 25 if(i+p[i]-1>x+j)x=i,j=p[i]-1; 26 if(p[i]>ans)ans=p[i]; 27 //cout<<i<<ch1[i]<<p[i]<<endl; 28 } 29 return ans-1; 30 } 31 int main(){ 32 int T;scanf("%d",&T); 33 while(T-->0){//ch[i],ch1[i],p[i]似乎都不用清空,因为所有的用之前都已经被清一次了。 34 scanf("%s",ch);n=strlen(ch); 35 int ma=Manacher(); 36 printf("%d\n",ma); 37 } 38 return 0; 39 }