回文自动机(BZOJ2565)
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; int p,next[][],cnt[],len[],fail[],last,a[],maxl[],maxr[];
char st[]; int newnode(int l){
p++;
for (int i=;i<=;i++) next[p][i]=;
cnt[p]=;
len[p]=l;
return(p);
} void init(){
p=-;
newnode();
newnode(-);
last=;
st[]=-;
fail[]=;
} int get_fail(int po,int x,int num){
while (a[po-len[x]-]!=num) x=fail[x];
return(x);
} void add(int po,int c){
int cur=get_fail(po,last,c);
if (!next[cur][c]){
int now=newnode(len[cur]+);
fail[now]=next[get_fail(po,fail[cur],c)][c];
next[cur][c]=now;
}
last=next[cur][c];
cnt[last]++;
} void count(){
for (int i=p;i>=;i--) cnt[fail[i]]+=cnt[i];
} int main(){
scanf("%s",&st);
int n=strlen(st);
for (int i=;i<=n;i++) a[i]=st[i-]-'a'+; init();
for (int i=;i<=n;i++)
add(i,a[i]),maxl[i]=len[last];
count(); for (int i=;i<=n/;i++){
int t=a[i];a[i]=a[n-i+];a[n-i+]=t;
}
init();
for (int i=;i<=n;i++)
add(i,a[i]),maxr[n-i+]=len[last];
count(); int ans=;
for (int i=;i<n;i++) ans=max(ans,maxl[i]+maxr[i+]);
printf("%d\n",ans);
}
每个节点表示一个本质不同的回文串(最多n个)。
进行count()后,cnt中存每个本质不同的回文串的出现次数。
------------------------------------------------------------------------
CODECHEF APRIL LUNCHTIME 2015 PALPROB
在fail树上转移palindromness
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#define LL long long
using namespace std; map <int,int> mp,mpb;
int p,tr[][],cnt[],len[],fail[],last,a[],maxl[],maxr[];
int ans[],nd[],nxt[],des[],T,scnt;
char st[]; void addedge(int x,int y){
nxt[++scnt]=nd[x];des[scnt]=y;nd[x]=scnt;
} int newnode(int l){
p++;
for (int i=;i<=;i++) tr[p][i]=;
cnt[p]=;ans[p]=;
len[p]=l;
return(p);
} void init(){
p=-;
newnode();newnode(-);
last=;
st[]=-;
fail[]=;
} int get_fail(int po,int x,int num){
while (a[po-len[x]-]!=num) x=fail[x];
return(x);
} void add(int po,int c){
int cur=get_fail(po,last,c);
if (tr[cur][c]==){
int now=newnode(len[cur]+);
fail[now]=tr[get_fail(po,fail[cur],c)][c];
tr[cur][c]=now;
}
last=tr[cur][c];
cnt[last]++;
} void count(){
for (int i=p;i>=;i--) cnt[fail[i]]+=cnt[i];
} void dfs(int po){
if (len[po]>=){
int t;
if (len[po]<=) t=-;else t=len[po]/;
int p=mp[t];
if (mpb[t])
ans[po]=ans[p]+;else
ans[po]=;
} mpb[len[po]]=;mp[len[po]]=po;
for (int p=nd[po];p!=-;p=nxt[p])
dfs(des[p]);
mpb[len[po]]=;
} int main(){
freopen("a.in","r",stdin); scanf("%d",&T);
while (T--){
scanf("%s",&st);
int n=strlen(st);
for (int i=;i<=n;i++) a[i]=st[i-]-'a'+; init();
for (int i=;i<=n;i++)
add(i,a[i]);
count(); for (int i=;i<=p;i++) nd[i]=-;scnt=;
for (int i=;i<=p;i++) if (i!=) addedge(fail[i],i); mp.clear();mpb.clear();
dfs(); LL ret=;
for (int i=;i<=p;i++) ret+=(LL)ans[i]*cnt[i];
printf("%lld\n",ret);
}
}
回文自动机(BZOJ2565)的更多相关文章
- bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...
- URAL 2040 (回文自动机)
Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ...
- URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...
- [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串
回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...
- BZOJ2160拉拉队排练——回文自动机
题目描述 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多 ...
- BZOJ2084[Poi2010]Antisymmetry——回文自动机
题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...
- BZOJ2342[Shoi2011]双倍回文——回文自动机
题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...
- 【XSY2715】回文串 树链剖分 回文自动机
题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(tra ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...
随机推荐
- C#操作Excell常用方法
这是在博客园看的文章,写的很好,所以转一下,方便自己以后用到的时候可以随时查看. range.NumberFormatLocal = "@"; //设置单元格格式为文本 r ...
- Java中 实现多线程成的三种方式(继承,实现,匿名内部类)
---------------------------------------------------------------------------------------------------- ...
- AFN3.0封装
总结了一下AFN3.0封装,也借鉴了其他人总结的,整理如下,希望多交流,互相进步 // // XJYSessionManager.h// // Created by XJY on 16/10/17. ...
- 在Asp.Net MVC中实现计算页面执行时间及简单流量统计
引用www.rsion.com.dll进您的asp.net MVC项目本人不才,源代码中有详细说明,查看demo修改HomeController public class HomeController ...
- 常用API——日期型函数Date
上图 ·声明 var myDate = new Date(); //系统当前时间 var myDate = new Date(yyyy, mm, dd, hh, mm, ss); var myDate ...
- mvc中服务器端、客户端属性验证
在mvc中使用表单进行数据提交时,数据验证分为服务器端验证和客户端验证: 我们可以通过使用HtmlHelper中的方法及在页面中引用js库对Model的属性的数据注解(System.Component ...
- Linux 日志报错 xxx blocked for more than 120 seconds
监控作业发现一台服务器(Red Hat Enterprise Linux Server release 5.7)从凌晨1:32开始,有一小段时间无法响应,数据库也连接不上,后面又正常了.早上检查了监听 ...
- [AlwaysOn Availability Groups]排查:AG超过RTO
排查:AG超过RTO 自动故障转移或者手动转移之后,没有数据都是,你可能会发现切换时间超过了你的RTO.或者当你评估切换时间同步提交secondary副本,发现超过了你的RTO. 1. 通常原因 通常 ...
- .NET应用程序调试—原理、工具、方法
阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...
- 随手小代码——生成GUID
GUID stGUID; CString strGUID; if (S_OK==::CoCreateGuid(&stGUID)) { strGUID.Format( TEXT("{% ...