http://www.lydsy.com/JudgeOnline/problem.php?id=3676

过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机里完成,但是忽略了增加新点时fa变动的情况,还是肉眼查错最管用。

得到的教训是既然倍增就在倍增的函数里完成,自动机就在自动机里完成,不要随便乱搞赋值。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
const int maxn=;
char ch[maxn]={};
char ch1[maxn*]={};
int siz,siz1;
struct sam{
int sig[];
int f,len,d[],num;
}t[maxn*];
int tot=,la=;
int loc[maxn]={},cnt[maxn*]={},b[maxn*]={},p[maxn*]={};
long long ans=;
void add(int z){
int x=++tot,i=la;
t[x].len=t[la].len+;
for(;i&&!t[i].sig[z];i=t[i].f)
t[i].sig[z]=x;
if(!i)t[x].f=;
else{
int p=t[i].sig[z];
if(t[p].len==t[i].len+)t[x].f=p;
else{
int y=++tot;
t[y]=t[p];t[y].len=t[i].len+;
t[p].f=t[x].f=y;
for(;i&&t[i].sig[z]==p;i=t[i].f)
t[i].sig[z]=y;
}
}
la=x;
}
void pre(){
int z;
for(int i=;i<=tot;i++)cnt[t[i].len]++;
for(int i=;i<=siz;i++)cnt[i]+=cnt[i-];
for(int i=tot;i;i--)b[cnt[t[i].len]--]=i;
for(int i=;i<=siz;i++)t[loc[i]].num=;
for(int i=tot;i;i--){
z=b[i];t[t[z].f].num+=t[z].num;
}
for(int i=;i<=tot;i++){
z=b[i];t[z].d[]=t[z].f;
for(int j=;j<=;j++)
t[z].d[j]=t[t[z].d[j-]].d[j-];
}
}
void getit(int l,int r){
r=r/;l=(l+)/;
if(r<l)return;
int z=loc[r];
for(int i=;i>-;i--){
if(t[t[z].d[i]].len>=r-l+){
z=t[z].d[i];
}
}
long long sum=(long long)t[z].num*(r-l+);
if(ans<sum)ans=sum;
}
void Manacher(){
for(int i=;i<=siz;i++)ch1[i*]=ch[i],ch1[i*-]='#';
ch1[siz*+]='#';ch1[siz*+]='\0';ch1[]='$';
siz1=siz*+;
int mx=,id=;
for(int i=;i<=siz1;i++){
if(mx>=i)p[i]=min(mx-i,p[id*-i]);
else p[i]=;
while(ch1[i+p[i]]==ch1[i-p[i]]){++p[i];getit(i-p[i]+,i+p[i]-);}
if(mx<i+p[i]){mx=i+p[i];id=i;}
}
}
int main(){
memset(t,,sizeof(t));
scanf("%s",ch+);siz=strlen(ch+);
for(int i=;i<=siz;i++){loc[i]=tot+;add(ch[i]-'a');}
pre();
Manacher();
printf("%lld\n",ans);
return ;
}

BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增的更多相关文章

  1. BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)

    题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ...

  2. 【BZOJ 3676】 3676: [Apio2014]回文串 (SAM+Manacher+倍增)

    3676: [Apio2014]回文串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2343  Solved: 1031 Description 考 ...

  3. [APIO2014]回文串 后缀自动机_Manancher_倍增

    Code: // luogu-judger-enable-o2 #include <cstdio> #include <algorithm> #include <cstr ...

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

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

  5. BZOJ 3676: [Apio2014]回文串

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

  6. 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串

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

  7. bzoj 3676: [Apio2014]回文串【回文自动机】

    回文自动机板子 或者是SAM+manacher+倍增,就是manacher求本质不同回文串(让f++的串),然后在SAM倍增查询对应点出现次数 #include<iostream> #in ...

  8. ●BZOJ 3676 [Apio2014]回文串

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 题解: 后缀数组,Manacher,二分 首先有一个结论:一个串的本质不同的回文串的个 ...

  9. BZOJ 3676 [Apio2014]回文串(回文树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3676 [题目大意] 考虑一个只包含小写拉丁字母的字符串s. 我们定义s的一个子串t的& ...

随机推荐

  1. css3图片响应式布局

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

  2. spring-boot 属性定义和配置bean

    自定义bean属性 1.定义bean属性 // 通过@ConfigurationProperties加载properties文件内的配置, // 通过prefix属性指定properties的配置的前 ...

  3. sniffer简单使用

    跟wireshark类似. 只是说显示的容易忘记所以丢张图记录一下. 该工具还是很坑爹的,不是比赛要用到所以都不是很想弄.一般机器运行不起来.不是蓝屏就是装了运行不了各种闪退,找了学校一台内网服务器才 ...

  4. 64_p1

    PEGTL-devel-1.3.1-2.fc26.i686.rpm 13-Feb-2017 22:10 64086 PEGTL-devel-1.3.1-2.fc26.x86_64.rpm 13-Feb ...

  5. IT人员必备linux安全运维之Ssh用途、安全性、身份认证以及配置……【转】

    SSH一般用途 提供shell,解决telnet不安全的传输 1.修改默认ssh默认端口 vi /etc/ssh/sshd_config 修改之后重启 >systemctl restart ss ...

  6. java各种链路工具性能监控工具

    Zipkin , Instana 和 Jaeger cat链路追踪系统 用于监控spring 的运行情况,比如内存,线程,池等宏观数据 spring boot admin java反编译 jar xv ...

  7. python从2.6.x升级到2.7.x

    [前提] 今日是20171207,目前Linux发行版默认安装的Python版本都是2.6.x,但是这个版本Python已经不再进行维护了. 所以需要将Python做一个升级,到2.7.x [注意] ...

  8. Codeigniter处理用户登录验证后URL跳转

    涉及到My_Controller.php以及登录验证模块User.php,代码如下: My_Controller.php class MY_Controller extends CI_Controll ...

  9. GO语言Windows下Liteide

    今天用到了. 就学习一下. https://www.golangtc.com/t/56e7caf5b09ecc66b90000fe 在网上看了好多此类介绍,操作太麻烦,自己琢磨出来怎么配置了. 以Li ...

  10. C++构造函数详解(复制构造函数)

    构造函数是干什么的 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员. 构造函数的种类 class Compl ...