首页 > 代码库 > 【BZOJ2565】最长双回文串 Manacher
【BZOJ2565】最长双回文串 Manacher
题解:
首先我们写一个Manacher模板。。
然后我们可以把所有回文串的信息映射到左端点上,
每个点依此维护最长右连接回文串。
然后再顺着扫一遍就出解了。
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 using namespace std; char ts[N],s[N<<1]; int n,len,p[N<<1]; void manacher() { int i,j,k,mx=0,id; scanf("%s",ts+1); n=strlen(ts+1),len=n*2+1; s[0]='*',s[1]='~'; for(i=1;i<=n;i++)s[i*2]=ts[i],s[i*2+1]='~'; for(i=1;i<=len;i++) { if(mx>i)p[i]=min(p[id*2-i],mx-i); else p[i]=1; while(s[i-p[i]]==s[i+p[i]])p[i]++; if(mx<i+p[i])mx=i+p[i],id=i; } return ; } int mx[N<<1],id,ans; void ex_manacher() { int i,j,k; for(i=1;i<=len;i++)mx[i]=i; for(i=0;i<=len;i++)mx[i-p[i]]=max(mx[i-p[i]],i); for(i=0;i<=len;i++) { mx[i]=max(mx[i],id); id=mx[i]; } for(i=0;i<=len;i++)ans=max(ans,mx[i+p[i]-1]-i); return ; } int main() { // freopen("test.in","r",stdin); manacher(); ex_manacher(); printf("%d\n",ans); return 0; }
复制去Google翻译翻译结果
【BZOJ2565】最长双回文串 Manacher
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。