回文自动机模板题

头铁了一下午hdu6599,最后发现自己的板有问题

先放这里一个正确性得到基本确认的板,过两天肝hdu6599

  1. #pragma GCC optimize(2)
  2. #include<bits/stdc++.h>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cassert>
  6. #define MAXN 300010
  7. #define LL long long
  8. #define BASE 2LL
  9. #define MOD 1000000007
  10. using namespace std;
  11.  
  12. char s[MAXN];
  13. int len;
  14. LL ans[MAXN];
  15.  
  16. int qpow(int base,int n){
  17. LL ans=;
  18. while(n){
  19. if(n&)ans=(ans*base)%MOD;
  20. base=(1LL*base*base)%MOD;
  21. n>>=;
  22. }
  23. return ans;
  24. }
  25.  
  26. struct PTnode{
  27. int len,fail,son[];
  28. LL cnt;//该点对应的回文串出现次数
  29. //建完了树,要再跑一遍,cnt才是正确的
  30. PTnode(){
  31. cnt=len=fail=;
  32. memset(son,,sizeof son);
  33. }
  34. }PTdian[MAXN<<];
  35.  
  36. int PTlast,PTnum;
  37.  
  38. int PTgetfail(int i,int x){
  39. while(s[i-PTdian[x].len-]!=s[i]) {
  40. x=PTdian[x].fail;
  41. }
  42. return x;
  43. }
  44.  
  45. void PTextend(int i,int x){
  46. int cur=PTgetfail(i,PTlast);
  47. if(!PTdian[cur].son[x]){
  48. int now=++PTnum;
  49. PTdian[now].len=PTdian[cur].len+;
  50. PTdian[now].fail=PTdian[PTgetfail(i,PTdian[cur].fail)].son[x];
  51. PTdian[cur].son[x]=now;
  52. }
  53. PTdian[PTdian[cur].son[x]].cnt++;
  54. PTlast=PTdian[cur].son[x];
  55. }
  56. void PTcount(){
  57. for(int i=PTnum;i>=;i--){
  58. //逆序累加
  59. PTdian[PTdian[i].fail].cnt+=PTdian[i].cnt;
  60. }
  61. }
  62. //int dfs(int l,int index,int hash1,int hash2){
  63. // if(index>1 && hash1==hash2){
  64. // ans[PTdian[index].len]+=PTdian[index].cnt;
  65. // }
  66. // for(int i=0;i<26;i++){
  67. // if(PTdian[index].son[i]!=0){
  68. // LL tmp1=(hash1+i*qpow(BASE,l)%MOD)%MOD;
  69. // LL tmp2=(BASE*hash2%MOD+i)%MOD;
  70. // dfs(l+1,PTdian[index].son[i],tmp1,tmp2);
  71. // }
  72. // }
  73. //}
  74. //char a[MAXN];
  75. //int dfs1(int depth,int index){
  76. // //检查回文自动机构造正确性
  77. // for(int i=0;i<depth;i++)printf("%c",a[i]);
  78. // printf(" len:%d siz:%d\n",PTdian[index].len,PTdian[index].cnt);
  79. // for(int i=0;i<26;i++){
  80. // if(PTdian[index].son[i]!=0){
  81. // a[depth]=i+'a';
  82. // dfs1(depth+1,PTdian[index].son[i]);
  83. // }
  84. // }
  85. //}
  86. int main(){
  87. // freopen("1.txt","r",stdin);
  88. // freopen("2.txt","w",stdout);
  89. while(){
  90. int rep=scanf("%s",s);
  91. if(rep==EOF)break;
  92. len=strlen(s);
  93. memset(ans,,sizeof ans);memset(PTdian,,sizeof PTdian);
  94. PTlast=PTnum=;
  95. PTdian[].len=-;
  96. PTdian[].fail=PTdian[].fail=;
  97.  
  98. for(int i=;i<len;i++){
  99. PTextend(i,s[i]-'a');
  100. }
  101. PTcount();
  102. LL maxx=;
  103. for(int i=;i<=PTnum;i++){
  104. maxx=max(maxx,1LL*PTdian[i].cnt*PTdian[i].len);
  105. }
  106. printf("%lld\n",maxx);
  107. // dfs(0,0,0,0);
  108. // dfs(0,1,0,0);
  109. // dfs1(0,0);
  110. // dfs1(0,1);
  111. // for(int i=1;i<=len;i++)printf("%lld%c",ans[i],(i!=len)?' ':'\n');
  112. }
  113.  
  114. }

hysbz3676 回文串 回文自动机的更多相关文章

  1. 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)

    传送门 对原串建立一个后缀自动机,然后用反串在上面匹配. 如果当前匹配的区间[l,r][l,r][l,r]包裹了当前状态的endposendposendpos中的最大值,那么[l,maxpos][l, ...

  2. bzoj 2565: 最长双回文串 回文自动机

    题目: Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba",不相同 ...

  3. 【bzoj3676】[Apio2014]回文串 回文自动机

    题目描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最大出现值. 输入 输入只有一行,为一个只包含小写字母( ...

  4. [Bzoj3676][Apio2014]回文串(后缀自动机)(parent树)(倍增)

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 3396  Solved: 1568[Submit][Statu ...

  5. 【bzoj3676】[Apio2014]回文串 —— 回文自动机的学习

    写题遇上一棘手的题,[Apio2014]回文串,一眼看过后缀数组+Manacher.然后就码码码...过是过了,然后看一下[Status],怎么慢这么多,不服..然后就搜了一下,发现一种新东西——回文 ...

  6. bzoj 3676: [Apio2014]回文串 回文自动机

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 844  Solved: 331[Submit][Status] ...

  7. BZOJ3676[Apio2014]回文串——回文自动机

    题目描述 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. 输入 输入只有一行,为一个只包含小写字 ...

  8. [bzoj3676][Apio2014]回文串——Manacher+后缀自动机+倍增

    Brief Description 一个回文串的value定义为这个回文串的长度乘以出现次数.给定一个字符串,求\(value_{max}\). Algorithm Design 我们使用Manach ...

  9. HYSBZ 2565 最长双回文串 (回文树)

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1377  Solved: 714 [Submit][Status][Dis ...

随机推荐

  1. 爬虫那些事儿--Http返回码

    由于爬虫的抓取也是使用http协议交互.因此需要了解Http的各种返回码所代表的意义,才能判断爬虫的执行结果. 返回码如下: 100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部 ...

  2. windows 计算器

    calc sin 弧度与角度

  3. Spring Cloud (Spring Cloud Stream)解析

    执行脚本目录 /bin windows 在其单独的目录 快速上手 下载并且解压kafka压缩包 运行服务 以Windows为例,首先打开cmd: 1.  启动zookeeper: bin\window ...

  4. leetcood学习笔记-104-二叉树的最大深度

    题目描述: 第一次提交: class Solution(object): def maxDepth(self, root): """ :type root: TreeNo ...

  5. HTML——表格标签

    存在即是合理的. 表格的现在还是较为常用的一种标签,但不是用来布局,常见处理.显示表格式数据. 创建表格 在HTML网页中,要想创建表格,就需要使用表格相关的标签.创建表格的基本语法格式如下: < ...

  6. xslt数值的函数与xslt字符串函数

    以下是xslt数值的函数与xslt字符串函数的说明与参考示例. 1.xslt数值的函数:(1)fn:number(arg) 返回参数的数值.参数可以是布尔值.字符串或节点集. 示例:<xsl:v ...

  7. pure-ftpd 配置

    # Disallow anonymous connections. Only allow authenticated users. NoAnonymous yes # If you want simp ...

  8. shell脚本实现取当前时间

    shell 实现获取当前时间,并进行格式转换的方法: 1)原格式输出 2018年 09月 30日 星期日 15:55:15 CST time1=$(date) echo $time1 2)时间串输出 ...

  9. 《转》python对象

    http://www.cnblogs.com/BeginMan/p/3160044.html 一.学习目录 1.pyhton对象 2.python类型 3.类型操作符与内建函数 4.类型工厂函数 5. ...

  10. 生产环境Docker部署ELK跨区访问kafka不通问题的解决

    由于分布式系统的日志集中采集的需求非常强烈,我们组通过调研和实践搭建了一套基于Docker的日志收集系统Amethyst. 我们首先在测试环境搭建了一套基于Docker swarm集群的ELK分布式环 ...