用manacher找出本质不同的回文子串放在SAM上跑

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
const int N=600005;
int n,p[N];
char s[N],c[N];
long long ans;
struct SAM
{
int la,cnt,pos[N],len[N],si[N],sa[N],fa[N],ch[N][27],c[N],f[N][19],de[N];
SAM()
{
la=++cnt;
}
void ins(int c,int id)
{
int p=la,cur=la=++cnt;
len[cur]=len[p]+1;
si[cur]=1;
pos[id]=la;
for(;p&&!ch[p][c];p=fa[p])
ch[p][c]=cur;
if(!p)
fa[cur]=1;
else
{
int q=ch[p][c];
if(len[q]==len[p]+1)
fa[cur]=q;
else
{
int nt=++cnt;
len[nt]=len[p]+1;
memcpy(ch[nt],ch[q],sizeof(ch[q]));
fa[nt]=fa[q];
fa[q]=fa[cur]=nt;
for(;ch[p][c]==q;p=fa[p])
ch[p][c]=nt;
}
}
}
void wk()
{
for(int i=1;i<=cnt;i++)
c[len[i]]++;
for(int i=1;i<=n;i++)
c[i]+=c[i-1];
for(int i=cnt;i>=1;i--)
sa[c[len[i]]--]=i;
for(int i=cnt;i>=1;i--)
si[fa[sa[i]]]+=si[sa[i]];
for(int i=1;i<=cnt;i++)
{
int u=sa[i];
de[u]=de[fa[u]]+1;
f[u][0]=fa[u];
for(int j=1;(1<<j)<=de[u];j++)
f[u][j]=f[f[u][j-1]][j-1];
}
}
void ques(int l,int r)
{
int x=pos[r];
for(int i=18;i>=0;i--)
if(len[f[x][i]]>=r-l+1)
x=f[x][i];
ans=max(ans,1ll*si[x]*(r-l+1));//cerr<<l<<" "<<r<<" "<<si[x]*(r-l+1)<<endl;
}
}sam;
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;i++)
sam.ins(s[i]-'a',i);
sam.wk();
s[0]='+';s[n+1]='*';
int mx=0,id;
for(int i=1;i<=n;i++)
{
if(mx>i)
p[i]=min(mx-i,p[2*id-i-1]);
else
p[i]=0;
while(s[i+p[i]+1]==s[i-p[i]])
{
p[i]++;
sam.ques(i-p[i]+1,i+p[i]);
}
if(p[i]+i>mx)
mx=p[i]+i,id=i;
}
mx=0;
for(int i=1;i<=n;i++)
{
if(mx>i)
p[i]=min(mx-i-1,p[2*id-i]);
else
{
p[i]=1;
sam.ques(i-p[i]+1,i+p[i]-1);
}
while(s[i+p[i]]==s[i-p[i]])
{
p[i]++;
sam.ques(i-p[i]+1,i+p[i]-1);
}
if(p[i]+i>mx)
mx=p[i]+i,id=i;
}
printf("%lld\n",ans);
return 0;
}

bzoj 3676: [Apio2014]回文串【后缀自动机+manacher】的更多相关文章

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

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

  2. BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增

    http://www.lydsy.com/JudgeOnline/problem.php?id=3676 过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机 ...

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

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

  4. BZOJ 3676: [Apio2014]回文串

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

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

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

  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. scoi2018游记

    day1: t1点分树 冬令营上jry讲过原题,t2启发式合并+解二次同余方程 预计100+100+0 结果t1卡内存,t2模数太大.导致调试到没有写t3 最后t1 85 t2 15 要是我会o1快速 ...

  2. navicat 无法连接到腾讯云Mysql

    远程连接进入服务器 远程连接进入服务器之后,输入命令mysql -u root -p 之后输入mysql密码,进入mysql 命令环境 设置开启远程登录 GRANT ALL PRIVILEGES ON ...

  3. 如何把你的Windows PC变成瘦客户机

    越来越多的用户开始使用vmware view 4.5来做为企业桌面虚拟化的平台,通过view,所有的管理工作都转移到数据中心,但是考虑到成本原因,很多人员还在使用PC机,有没有办法将PC机变成瘦客户机 ...

  4. strstr-strcat实现

    strstr 调用格式 #include <string.h> char *strstr(const char *haystack, const char *needle); 功能说明 该 ...

  5. 为Java说句公道话

    为Java说句公道话 有些人问我,在现有的语言里面,有什么好的推荐?我说:"Java. " 他们非常吃惊:"什么?Java!" 所以我如今来解释一下. Java ...

  6. javascript是什么?

    JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由全部的现 ...

  7. Android 使用 DownloadManager 管理系统下载任务的方法

    在红黑联盟上看到的.这几天一直考虑做一个Notification 的带下载功能的自己定义通知.但没搞出来.无意中在论坛看到这个.先Mark,明天试试. 从Android 2.3(API level 9 ...

  8. 《Java设计模式》之訪问者模式

    訪问者模式是对象的行为模式.訪问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作须要改动的话,接受这个操作的数据结构则能够保持不变. 分派的概念 变量被声明时的类型叫做变量的静态类 ...

  9. php 文件压缩zip扩展

    <?php function addFileToZip($path, $zip) { $handler = opendir($path); //打开当前文件夹由$path指定. while (( ...

  10. #include &quot;*.c&quot;文件的妙用

    今天我在看代码的时候突然看到在一个.c文件里包括了#include "*.c"代码,这个让我非常诧异,然后google了一下.才发现是这么回事情.以下我写了一个測试代码.我相信你看 ...