最长回文 HDU - 3068
模板题,同样没有难度。
顺便一提,因为Manacher的算法他会预处理插入分割符
所以我们无论在统计长度还是其他什么信息时是相对比较麻烦的
有时候甚至是要进行分类讨论。
难点就在这里
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int max_n = 3e5+100; int n; void Manacher(char s[],int d[],char ts[]){ int m=n*2+1; fill(d,d+m+10,1); for (int i=0,j=0;i<n;++i){ ts[j++]='#';ts[j++]=s[i]; }ts[m-1]='#';ts[m]='\0'; for (int i=0,j=-1,t=0;i<m;++i){ if (j>=i)d[i]=min(j-i+1,d[(t<<1)-i]); while (i+d[i]<m&&i-d[i]>=0&&ts[i+d[i]]==ts[i-d[i]])++d[i]; if (i+d[i]>j)j=i+d[i]-1,t=i; } } char s[max_n],ts[max_n<<1]; int d[max_n<<1]; int main(){ while (~scanf("\n%s",s)){ n = strlen(s); Manacher(s,d,ts); n = n*2+1; int len = 1; for (int i=1;i<n;++i){ if (i&1)len = max(len,d[i]-1); else len = max(len,(d[i]>>1)<<1); }printf("%d\n",len); } }
Kuangbin题单详解(kmpManacher) 文章被收录于专栏
刷Kuangbin题