博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P4287 [SHOI2011]双倍回文(回文自动机)
阅读量:4880 次
发布时间:2019-06-11

本文共 942 字,大约阅读时间需要 3 分钟。

 

听说有大佬用manacher$O(n)$过此题……太强啦……

说一下PAM的做法吧。(看了题解之后发现)蛮简单的

我们肯定要先建出回文自动机的

然后如果是枚举每一个节点暴跳fail指针肯定得T

那么我们对于每一个节点记录一个$trans[i]$,表示小于等于它长度一半的节点

这个可以在建自动机的时候顺便求出来,具体看代码

然后对每一个节点判断长度是否模4为0且$trans[i]$的长度是它的一半就好了

1 //minamoto 2 #include
3 #include
4 template
inline bool cmax(T&a,const T&b){
return a
len[q]) tmp=fail[tmp];27 trans[q]=ch[tmp][x];28 }29 }30 cnt[last=ch[p][x]]++;31 }32 }33 int main(){34 // freopen("testdata.in","r",stdin);35 scanf("%d",&n);36 scanf("%s",s+1);37 s[0]=-1,fail[0]=1,last=0;38 len[0]=0,len[1]=-1,tot=1;39 build();40 for(int i=tot;i>=2;--i) cnt[fail[i]]+=cnt[i];41 for(int i=2;i<=tot;++i)42 if((len[trans[i]]<<1)==len[i]&&len[i]%4==0) cmax(ans,len[i]);43 printf("%d\n",ans);44 return 0;45 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9629708.html

你可能感兴趣的文章
系统开发管理、架构与设计步步谈随笔索引
查看>>
Java的时间空间复杂度详解
查看>>
有效防止SQL注入漏洞
查看>>
Linux chown命令
查看>>
十、I/O流——4-输入、输出流体系
查看>>
十二、网络编程——4-基于UDP协议的网络编程
查看>>
异常处理与调试6 - 零基础入门学习Delphi55(完)
查看>>
if语句三种形式
查看>>
正则表达式之字符串验证
查看>>
codeblocks如何支持_tmain?可移植代码的编码推荐
查看>>
省市联动 填坑
查看>>
canvas写的一个小时钟demo
查看>>
原来今天是冬至
查看>>
又混了一天班
查看>>
九度oj 1006
查看>>
HDU6400-2018ACM暑假多校联合训练1004-Parentheses Matrix-构造
查看>>
最短路问题专题
查看>>
《Redis复制与可扩展集群搭建》看后感
查看>>
Jquery Mobile总结
查看>>
223. Rectangle Area
查看>>