博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2565 最长回文串
阅读量:5884 次
发布时间:2019-06-19

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

回文自动机!

正着跑一遍 记录以每个点作为回文子串的右端点的最大长度

倒过来跑一遍 记录每个点作为左端点的最大长度

求个和就好啦

附代码。

#include
#include
#include
#include
#define inf 20021225#define ll long long#define mxn 100010using namespace std;struct node{int fa,ch[26],len;}t[mxn];int poi,lt,f[mxn],s[mxn],n,len,ans;char ch[mxn];void init(){ memset(s,0,sizeof(s)); for(int i=0;i<=poi;i++) memset(t[i].ch,0,sizeof(t[i].ch)),t[i].fa=t[i].len=0; s[0] = -1; t[1].fa = t[0].fa =1; t[1].len = -1; t[0].len = 0; poi = lt = 1; n=0;}int id(char c){return c-'a';}void extend(int c,int b,int id){ //printf("%d\n",c); int p = lt; s[++n] = c; while(s[n-1-t[p].len]!=c) 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]!=c) np = t[np].fa; t[q].fa = t[np].ch[c]; t[p].ch[c] = q; } lt = t[p].ch[c]; if(b) f[id+1] = t[lt].len; else ans=max(f[id]+t[lt].len,ans);}int main(){ scanf("%s",ch); len = strlen(ch); init(); for(int i=0;i

这玩意跑的奇快无比。

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

你可能感兴趣的文章
ORACLE---Unit04: SQL(高级查询)
查看>>
贪食蛇
查看>>
201521123009 《Java程序设计》第11周学习总结
查看>>
Python3之多线程学习
查看>>
MVC和MTV结构分析
查看>>
(转)微信网页扫码登录的实现
查看>>
mariadb启动报错:[ERROR] Can't start server : Bind on unix socket: Permission denied
查看>>
nginx的信号量
查看>>
云im php,网易云IM
查看>>
河南农业大学c语言平时作业答案,河南农业大学2004-2005学年第二学期《C语言程序设计》期末考试试卷(2份,有答案)...
查看>>
c语言打开alist文件,C语言 文件的打开与关闭详解及示例代码
查看>>
c语言 中的共用体和结构体如何联合定义,结构体(Struct)、联合体(Union)和位域
查看>>
SDL如何嵌入到QT中?!
查看>>
P1026 统计单词个数
查看>>
[js高手之路] html5 canvas系列教程 - 状态详解(save与restore)
查看>>
poi excel 常用api
查看>>
AD提高动态的方法(附SNR计算)
查看>>
[转]轻松实现可伸缩性,容错性,和负载平衡的大规模多人在线系统
查看>>
五 数组
查看>>
也谈跨域数据交互解决方案
查看>>