luogu P1723 高手过愚人节
打算下周讲课就讲Manacher了
所以百度了一下相关题目,发现了一道千古好题
这道题没想到是一道模板题,模板中的模板
简要说一下思路,我们先复制一遍模板(甚至变量都不用改
然后唯一的区别就是要求的是最长连续回文子串长度
那么我们就在Manacher函数里在最后统计一下最大值就行
优秀的代码在这里
#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; }
你是我路过人间时藏在山河里的唯一秘密
也是我披星戴月奔赴万里无奈的触不可及