回文自动机(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; ...
随机推荐
- jquery弹出下拉列表插件(实现kindeditor的@功能)
这几天有个工作需求,就是在富文本输入区域(kindeditor)可以有@功能,能够容易提示用户名的(像在qq群组@人一样).在网上找了一个叫bootstrap-suggest的插件,却不能满足我的需求 ...
- supermap iclient for js 标签专题图(服务端)
<!DOCTYPE><html> <head> <meta http-equiv="Content-Type" content=" ...
- 【代码笔记】iOS-替换电话号码中间4位为-号
一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...
- iOS Swift-HelloWord
iOS Swift-HelloWord 按部就班选择Swif开发语言,输出HelloWord. override func viewDidLoad() { super.viewDidLoad() pr ...
- maven工程模块化
前言 项目的模块化有利于任务分工,后期维护,易扩展,模块还可以独立成服务单独部署等: 创建packaging类型为POM的父项目 我用的maven插件是m2e,相信大部分人在eclipse装的也是m2 ...
- Oracle创建表空间、用户、授权
在创建好数据实例(数据库)好后的基础上,后续做的事情如下: ---创建表空间 create tablespace LIS2011DATA logging datafile 'd:\oracle\pro ...
- RMAN命令LIST操作总结
在使用RMAN备份.还原的过程中,我们经常需要查看备份的一些详细信息,例如,RMAN提供了LIST命令.关于LIST命令的详细信息 可以参考Oracle Database Backup and Rec ...
- asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作
在之前的文章中,我们使用的都是持久连接,但是使用持久连接的话,这种模拟socket的形式使用起来还是很不方便的,比如只有一个唯一的 OnReceived方法来处理业务逻辑,如下图: protected ...
- 解决session阻塞的问题
简介 对于数据库运维人员来说创建session或者查询时产生问题是常规情况,下面介绍一种很有效且不借助第三方工具的方式来解决类似问题. 最近开始接触运维工作,所以自己总结一些方案便于不懂数据库的同事解 ...
- .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)
阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...