回文自动机(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; ...
随机推荐
- 【转载】Oracle递归查询:使用prior实现树操作【本文出自叶德华博客】
本文标题:Oracle递归查询:使用prior实现树操作 本文链接:http://yedward.net/?id=41 本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处. Oracle ...
- iOS UISearchController的使用
在iOS9中,UISearchDisplayController 已经被UISearchController替代.搜索框是一种常用的控件. 假设我们要满足下图的需求,产生100个“数字+三个随机字母” ...
- android FrameLayout详解
首先看演示: FrameLayout框架布局是最简单的布局形式.所有添加到这个布局中的视图都以层叠的方式显示.第一个添加的控件被放在最底层,最后一个添加到框架布局中的视图显示在最顶层,上一层的控件会覆 ...
- Mac安装mysql遇到的坑
使用XMPP前安装了mysql,小白遇到好多坑,不要见怪 mysql官网下载,选择Community中扩展名为dmg的文件 安装完成后要记住密码,重要的事情只说一遍,对了,安装时也没有偏好设置和自启动 ...
- JVM-内存管理
都说搞C的牛叉,那是因为C解决问题,全靠程序员自己,他们对自己的程序在内存中是什么样了如指掌.而Java呢不需要有太多操作系统的知识,不用时刻注意内存的问题,但这不代表我们就不用去了解它背后的原理.J ...
- iPhone 丢失
http://www.appvv.com/zhuanti/iccid/ 第一步:iPhone丢失后,及时报警,在最短时间内补办SIM卡或把卡停掉. 第二步:输入查询网址:sn.appvv.com 输入 ...
- Memcache学习整理
一.Memcache 是什么? 组成:程序进程管理.Socket 程序进程:Memcache把内存先分成几个大份,每一份分成多个小份.例如:小份中有5M...0.9M.0.8M.....0.1M,一份 ...
- ORA-01502: index ‘index_name' or partition of such index is in unusable state
错误现象: 今天发布脚本时,一个表插入数据时报如下错误 ORA-01502: index ‘index_name' or partition of such index is in unusable ...
- SQLServer复制(二)--事务代理作业
之前的一篇已经介绍了如何配置复制,介绍了发布者.分发者和订阅者以及事务日志运行的简单关系.其中提到了复制代理,我们这篇将详细介绍复制代理,它是什么?在事务复制的步骤中起到了什么作用? 代理和工作 首先 ...
- mvn常用命令
1. mvn compile 编译源代码 2. mvn test-compile 编译测试代码 3. mvn test 运行测试 4. mvn package 打包,根据pom.xml打成war或ja ...