博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3676 [Apio2014]回文串
阅读量:6957 次
发布时间:2019-06-27

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

回文自动机板子题~

回文自动机和ACA以及SAM都是很类似的[毕竟都是自动机吗233]

回文自动机的树形结构是 fail指针构成的

用增量法 构造即可

(其实我也没完全学懂呢T^T)

#include
#include
#include
#include
#define inf 20021225#define ll long long#define mxn 310000using namespace std;struct node{int ch[26],len,fa,s;}t[mxn];// ch add character fa fail s timeschar ch[mxn]; int lt,poi,s[mxn],n; ll ans;void init(){ s[0]=-1; t[0].len=0; t[1].len=-1; t[0].fa=1; t[1].fa=1; poi=lt=1;}int id(char c){return c-'a';}void extend(int c){ int p=lt; s[++n]=c; while(s[n-1-t[p].len] != s[n]) p=t[p].fa; if(!t[p].ch[c]) { int q=++poi; t[q].len=t[p].len+2;int np = t[p].fa; while(s[n-1-t[np].len] != s[n]) np=t[np].fa; t[q].fa=t[np].ch[c]; t[p].ch[c]=q; } lt=t[p].ch[c]; t[lt].s++;}void calc(){ for(int i=poi;~i;i--) t[t[i].fa].s += t[i].s; for(int i=0;i<=poi;i++) ans=max(ans,1ll*t[i].len*t[i].s);}int main(){ scanf("%s",ch); init(); int n = strlen(ch); for(int i=0;i

转载于:https://www.cnblogs.com/hanyuweining/p/10321912.html

你可能感兴趣的文章
网线是否能完全替代电话线
查看>>
Docker学习之仓库
查看>>
使用history.pushState()和popstate事件实现AJAX的前进、后退功能
查看>>
我的友情链接
查看>>
VBA开发者的转型之路
查看>>
无法打开网站二级链接的解决办法
查看>>
我的友情链接
查看>>
Mybatis的整体架构
查看>>
跟我学习dubbo-简介(1)
查看>>
我的友情链接
查看>>
BeanShell作用域范围修饰符this、super和global
查看>>
Android spannableStringBuilder用法整理
查看>>
给出两个单词,找到它们的最短距离 (以它们之间隔了多少个单词计数)。
查看>>
C#学习基本概念之数据类型(2)---(C#与Java)
查看>>
我的友情链接
查看>>
学习/proc虚拟文件系统(六)
查看>>
12个优化Unity/GearVR应用的小技巧
查看>>
web.xml加载顺序
查看>>
MPMoviePlayerController iphone视频播放器
查看>>
NexentaStor 安装篇
查看>>