回文自动机(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; ...
随机推荐
- input checkbox 扩大点击范围
<div style="width:100%;height:100px;"><input type="checkbox" onclick=&q ...
- javascript中的prototype和constructor
构造函数 我们知道,ECMAScript5中的Object.Array.Date.RegExp.Function等引用类型都是基于构造函数的,他们本身就是ECMAScript5原生的构造函数.比如,我 ...
- ae arcgis engine 关于面转线的方法和注意事项
代码很简单,如下 private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs ...
- [Animatable Properties](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/AnimatableProperties/AnimatableProperties.html)
 
- Android 手机卫士--确认密码对话框编写
本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. ...
- Jdk 环境搭建
在安装完jdk后,还需要对jdk的环境变量进行配置才能正常使用,下面教大家如何配置jdk环境变量: 1.右键选择 计算机→属性→高级系统设置→高级→环境变量
- iOS国际化
本文介绍iOS国际化包含以下几种: 应用名称,文字,图片和xib 首先在工程里添加支持的语言,这里用了English和中文 然后创建两个.strings类型的文件,文件名分别为InfoPlist和Lo ...
- 我们为什么要使用maven,公司推行maven杂谈
最近在公司内推荐使用maven,推荐一个落后于业内十年的技术,实在没什么好说的,可是没想到遇到了前所未有的阻力,总是听到各种各样的质疑,我就闹不明白了,推行这个东西是为了更规范的管理项目成果,方便大家 ...
- #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案
郑昀 基于李丹和刘奎的文档 创建于2014/12/5 关键词:监控.dashboard.PHP.graphite.statsd.whisper.carbon.grafana.influxdb.Pyth ...
- java数组对象的浅层复制与深层复制
实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.