1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. int p,next[][],cnt[],len[],fail[],last,a[],maxl[],maxr[];
  7. char st[];
  8.  
  9. int newnode(int l){
  10. p++;
  11. for (int i=;i<=;i++) next[p][i]=;
  12. cnt[p]=;
  13. len[p]=l;
  14. return(p);
  15. }
  16.  
  17. void init(){
  18. p=-;
  19. newnode();
  20. newnode(-);
  21. last=;
  22. st[]=-;
  23. fail[]=;
  24. }
  25.  
  26. int get_fail(int po,int x,int num){
  27. while (a[po-len[x]-]!=num) x=fail[x];
  28. return(x);
  29. }
  30.  
  31. void add(int po,int c){
  32. int cur=get_fail(po,last,c);
  33. if (!next[cur][c]){
  34. int now=newnode(len[cur]+);
  35. fail[now]=next[get_fail(po,fail[cur],c)][c];
  36. next[cur][c]=now;
  37. }
  38. last=next[cur][c];
  39. cnt[last]++;
  40. }
  41.  
  42. void count(){
  43. for (int i=p;i>=;i--) cnt[fail[i]]+=cnt[i];
  44. }
  45.  
  46. int main(){
  47. scanf("%s",&st);
  48. int n=strlen(st);
  49. for (int i=;i<=n;i++) a[i]=st[i-]-'a'+;
  50.  
  51. init();
  52. for (int i=;i<=n;i++)
  53. add(i,a[i]),maxl[i]=len[last];
  54. count();
  55.  
  56. for (int i=;i<=n/;i++){
  57. int t=a[i];a[i]=a[n-i+];a[n-i+]=t;
  58. }
  59. init();
  60. for (int i=;i<=n;i++)
  61. add(i,a[i]),maxr[n-i+]=len[last];
  62. count();
  63.  
  64. int ans=;
  65. for (int i=;i<n;i++) ans=max(ans,maxl[i]+maxr[i+]);
  66. printf("%d\n",ans);
  67. }

每个节点表示一个本质不同的回文串(最多n个)。

进行count()后,cnt中存每个本质不同的回文串的出现次数。

------------------------------------------------------------------------

CODECHEF APRIL LUNCHTIME 2015 PALPROB

在fail树上转移palindromness

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <map>
  5. #define LL long long
  6. using namespace std;
  7.  
  8. map <int,int> mp,mpb;
  9. int p,tr[][],cnt[],len[],fail[],last,a[],maxl[],maxr[];
  10. int ans[],nd[],nxt[],des[],T,scnt;
  11. char st[];
  12.  
  13. void addedge(int x,int y){
  14. nxt[++scnt]=nd[x];des[scnt]=y;nd[x]=scnt;
  15. }
  16.  
  17. int newnode(int l){
  18. p++;
  19. for (int i=;i<=;i++) tr[p][i]=;
  20. cnt[p]=;ans[p]=;
  21. len[p]=l;
  22. return(p);
  23. }
  24.  
  25. void init(){
  26. p=-;
  27. newnode();newnode(-);
  28. last=;
  29. st[]=-;
  30. fail[]=;
  31. }
  32.  
  33. int get_fail(int po,int x,int num){
  34. while (a[po-len[x]-]!=num) x=fail[x];
  35. return(x);
  36. }
  37.  
  38. void add(int po,int c){
  39. int cur=get_fail(po,last,c);
  40. if (tr[cur][c]==){
  41. int now=newnode(len[cur]+);
  42. fail[now]=tr[get_fail(po,fail[cur],c)][c];
  43. tr[cur][c]=now;
  44. }
  45. last=tr[cur][c];
  46. cnt[last]++;
  47. }
  48.  
  49. void count(){
  50. for (int i=p;i>=;i--) cnt[fail[i]]+=cnt[i];
  51. }
  52.  
  53. void dfs(int po){
  54. if (len[po]>=){
  55. int t;
  56. if (len[po]<=) t=-;else t=len[po]/;
  57. int p=mp[t];
  58. if (mpb[t])
  59. ans[po]=ans[p]+;else
  60. ans[po]=;
  61. }
  62.  
  63. mpb[len[po]]=;mp[len[po]]=po;
  64. for (int p=nd[po];p!=-;p=nxt[p])
  65. dfs(des[p]);
  66. mpb[len[po]]=;
  67. }
  68.  
  69. int main(){
  70. freopen("a.in","r",stdin);
  71.  
  72. scanf("%d",&T);
  73. while (T--){
  74. scanf("%s",&st);
  75. int n=strlen(st);
  76. for (int i=;i<=n;i++) a[i]=st[i-]-'a'+;
  77.  
  78. init();
  79. for (int i=;i<=n;i++)
  80. add(i,a[i]);
  81. count();
  82.  
  83. for (int i=;i<=p;i++) nd[i]=-;scnt=;
  84. for (int i=;i<=p;i++) if (i!=) addedge(fail[i],i);
  85.  
  86. mp.clear();mpb.clear();
  87. dfs();
  88.  
  89. LL ret=;
  90. for (int i=;i<=p;i++) ret+=(LL)ans[i]*cnt[i];
  91. printf("%lld\n",ret);
  92. }
  93. }

回文自动机(BZOJ2565)的更多相关文章

  1. bzoj千题计划305:bzoj2565: 最长双回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2565 正着构造回文自动机 倒过来再构造一个回文自动机 分别求出以位置i开始的和结尾的最长回文串 # ...

  2. 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做

    题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...

  3. URAL 2040 (回文自动机)

    Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ...

  4. URAL 2040 Palindromes and Super Abilities 2 (回文自动机)

    Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...

  5. [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串

    回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...

  6. BZOJ2160拉拉队排练——回文自动机

    题目描述 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多 ...

  7. BZOJ2084[Poi2010]Antisymmetry——回文自动机

    题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...

  8. BZOJ2342[Shoi2011]双倍回文——回文自动机

    题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...

  9. 【XSY2715】回文串 树链剖分 回文自动机

    题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(tra ...

  10. 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)

    模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...

随机推荐

  1. jquery弹出下拉列表插件(实现kindeditor的@功能)

    这几天有个工作需求,就是在富文本输入区域(kindeditor)可以有@功能,能够容易提示用户名的(像在qq群组@人一样).在网上找了一个叫bootstrap-suggest的插件,却不能满足我的需求 ...

  2. supermap iclient for js 标签专题图(服务端)

    <!DOCTYPE><html> <head> <meta http-equiv="Content-Type" content=" ...

  3. 【代码笔记】iOS-替换电话号码中间4位为-号

    一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...

  4. iOS Swift-HelloWord

    iOS Swift-HelloWord 按部就班选择Swif开发语言,输出HelloWord. override func viewDidLoad() { super.viewDidLoad() pr ...

  5. maven工程模块化

    前言 项目的模块化有利于任务分工,后期维护,易扩展,模块还可以独立成服务单独部署等: 创建packaging类型为POM的父项目 我用的maven插件是m2e,相信大部分人在eclipse装的也是m2 ...

  6. Oracle创建表空间、用户、授权

    在创建好数据实例(数据库)好后的基础上,后续做的事情如下: ---创建表空间 create tablespace LIS2011DATA logging datafile 'd:\oracle\pro ...

  7. RMAN命令LIST操作总结

    在使用RMAN备份.还原的过程中,我们经常需要查看备份的一些详细信息,例如,RMAN提供了LIST命令.关于LIST命令的详细信息 可以参考Oracle Database Backup and Rec ...

  8. asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作

    在之前的文章中,我们使用的都是持久连接,但是使用持久连接的话,这种模拟socket的形式使用起来还是很不方便的,比如只有一个唯一的 OnReceived方法来处理业务逻辑,如下图: protected ...

  9. 解决session阻塞的问题

    简介 对于数据库运维人员来说创建session或者查询时产生问题是常规情况,下面介绍一种很有效且不借助第三方工具的方式来解决类似问题. 最近开始接触运维工作,所以自己总结一些方案便于不懂数据库的同事解 ...

  10. .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)

    阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...