打算下週講課就講Manacher了c++
因此百度了一下相關題目,發現了一道千古好題函數
這道題沒想到是一道模板題,模板中的模板spa
簡要說一下思路,咱們先複製一遍模板(甚至變量都不用改code
而後惟一的區別就是要求的是最長連續迴文子串長度blog
那麼咱們就在Manacher函數裏在最後統計一下最大值就行ci
優秀的代碼在這裏get
#include<bits/stdc++.h> using namespace std; const int N = 21000000; char s[N],str[N]; int p[N],n; int init(){ int len=strlen(s); str[0]='@',str[1]='#'; int j=1; for(int i=0;i<len;++i){ str[++j]=s[i]; str[++j]='#'; } str[++j]='\0'; return j; } int Manacher(){ int id=1,mx=1,maxn=0,len=init(); for(int i=1;i<len;++i){ if(i<mx) p[i]=min(p[id*2-i],mx-i); else p[i]=1; while(str[i-p[i]]==str[i+p[i]]) p[i]++; if(i+p[i]>mx){ mx=i+p[i]; id=i; } maxn=max(maxn,p[i]-1);//敲黑板,惟一的區別 } return maxn; } int main(){ cin>>n; while(n--){ memset(p,0,sizeof(p)); cin>>s; cout<<Manacher()<<endl; } return 0; }