回文自动机模板题

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

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

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<cassert>
#define MAXN 300010
#define LL long long
#define BASE 2LL
#define MOD 1000000007
using namespace std; char s[MAXN];
int len;
LL ans[MAXN]; int qpow(int base,int n){
LL ans=;
while(n){
if(n&)ans=(ans*base)%MOD;
base=(1LL*base*base)%MOD;
n>>=;
}
return ans;
} struct PTnode{
int len,fail,son[];
LL cnt;//该点对应的回文串出现次数
//建完了树,要再跑一遍,cnt才是正确的
PTnode(){
cnt=len=fail=;
memset(son,,sizeof son);
}
}PTdian[MAXN<<]; int PTlast,PTnum; int PTgetfail(int i,int x){
while(s[i-PTdian[x].len-]!=s[i]) {
x=PTdian[x].fail;
}
return x;
} void PTextend(int i,int x){
int cur=PTgetfail(i,PTlast);
if(!PTdian[cur].son[x]){
int now=++PTnum;
PTdian[now].len=PTdian[cur].len+;
PTdian[now].fail=PTdian[PTgetfail(i,PTdian[cur].fail)].son[x];
PTdian[cur].son[x]=now;
}
PTdian[PTdian[cur].son[x]].cnt++;
PTlast=PTdian[cur].son[x];
}
void PTcount(){
for(int i=PTnum;i>=;i--){
//逆序累加
PTdian[PTdian[i].fail].cnt+=PTdian[i].cnt;
}
}
//int dfs(int l,int index,int hash1,int hash2){
// if(index>1 && hash1==hash2){
// ans[PTdian[index].len]+=PTdian[index].cnt;
// }
// for(int i=0;i<26;i++){
// if(PTdian[index].son[i]!=0){
// LL tmp1=(hash1+i*qpow(BASE,l)%MOD)%MOD;
// LL tmp2=(BASE*hash2%MOD+i)%MOD;
// dfs(l+1,PTdian[index].son[i],tmp1,tmp2);
// }
// }
//}
//char a[MAXN];
//int dfs1(int depth,int index){
// //检查回文自动机构造正确性
// for(int i=0;i<depth;i++)printf("%c",a[i]);
// printf(" len:%d siz:%d\n",PTdian[index].len,PTdian[index].cnt);
// for(int i=0;i<26;i++){
// if(PTdian[index].son[i]!=0){
// a[depth]=i+'a';
// dfs1(depth+1,PTdian[index].son[i]);
// }
// }
//}
int main(){
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
while(){
int rep=scanf("%s",s);
if(rep==EOF)break;
len=strlen(s);
memset(ans,,sizeof ans);memset(PTdian,,sizeof PTdian);
PTlast=PTnum=;
PTdian[].len=-;
PTdian[].fail=PTdian[].fail=; for(int i=;i<len;i++){
PTextend(i,s[i]-'a');
}
PTcount();
LL maxx=;
for(int i=;i<=PTnum;i++){
maxx=max(maxx,1LL*PTdian[i].cnt*PTdian[i].len);
}
printf("%lld\n",maxx);
// dfs(0,0,0,0);
// dfs(0,1,0,0);
// dfs1(0,0);
// dfs1(0,1);
// for(int i=1;i<=len;i++)printf("%lld%c",ans[i],(i!=len)?' ':'\n');
} }

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. ADS 命令行命令介绍

    armasm 1. 命令:armasm [选项] -o 目标文件 源文件 2. 选项说明 -Errors 错误文件名        ;指定一个错误输出文件 -I 目录[,目录]          ;指 ...

  2. windows 和 linux 多线程

    学习了几天多线程技术,做个总结,便于记忆. 一般 多线程传递参数 为 void*  所以会有一个强制转换过程  (int*) (void *)等,传递多个参数选择 结构体指针.为了避免多个线程访问数据 ...

  3. (PASS)java中nextInt()函数

    一:获取随机数的函数: package test; import java.util.Random; /** * * @ClassName: NextIntDemo * @Description: n ...

  4. jq-demo-在列表中添加新节点,点击删除

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. [原创] delphi Memo 滚动到底部/开始 [Delphi XE、Delphi 7]

    以前控制Memo滚动到底部的操作: SendMessage(memo1.Handle,WM_VSCROLL,SB_BOTTOM,0); 或者 Memo1.SelLength:=Length(Memo1 ...

  6. R语言 变量

    R语言变量 变量为我们提供了我们的程序可以操作的命名存储. R语言中的变量可以存储原子向量,原子向量组或许多Robject的组合. 有效的变量名称由字母,数字和点或下划线字符组成. 变量名以字母或不以 ...

  7. 阿里巴巴AI夺肝结节诊断两项世界冠军,至今无人超越

    在澳门用人工智能预测流感趋势后,阿里巴巴还在继续探索如何用科技保障人类健康,这一次是更准确地测量肝结节. 12月28日消息,在全球LiTS(Liver Tumor Segmentation Chall ...

  8. CM自动化安装CDH5.14.0详解

    CDH5.14.0版本说明 CDH最早版本只包含hadoop.hive.hbase等基础组件,CDH5.14.0版本目前已经封装了spark.impala.kudu(CDH 5.13.x开始)等众多组 ...

  9. NX二次开发-UFUN拉伸函数UF_MODL_create_extruded2

    NX9+VS2012 //NX二次开发中常用拉伸函数为UF_MODL_create_extruded2,但是此函数不能拉伸片体, //想要拉伸片体用函数UF_MODL_create_extruded. ...

  10. 牛客多校第十场 F Popping Balloons 线段树维护稀疏矩阵

    题意: 给定一个稀疏矩阵,里面有若干个气球,让你横着开三枪,竖着开三枪,问最多能打爆多少气球,要求相同方向,相邻两枪必须间隔r. 题解: 横向记录每列有多少个气球,分别在哪行上. 然后把这个数据改造成 ...