bzoj 3676: [Apio2014]回文串【后缀自动机+manacher】
用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】的更多相关文章
- BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)
题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ...
- BZOJ 3676: [Apio2014]回文串 后缀自动机 Manacher 倍增
http://www.lydsy.com/JudgeOnline/problem.php?id=3676 过程很艰难了,第一次提交Manacher忘了更新p数组,超时,第二次是倍增的第0维直接在自动机 ...
- bzoj 3676: [Apio2014]回文串 回文自动机
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 844 Solved: 331[Submit][Status] ...
- BZOJ 3676: [Apio2014]回文串
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2013 Solved: 863[Submit][Status ...
- 【BZOJ 3676】 3676: [Apio2014]回文串 (SAM+Manacher+倍增)
3676: [Apio2014]回文串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2343 Solved: 1031 Description 考 ...
- 字符串(马拉车算法,后缀数组,稀疏表):BZOJ 3676 [Apio2014]回文串
Description 考虑一个只包含小写拉丁字母的字符串s.我们定义s的一个子串t的“出 现值”为t在s中的出现次数乘以t的长度.请你求出s的所有回文子串中的最 大出现值. Input 输入只有一行 ...
- bzoj 3676: [Apio2014]回文串【回文自动机】
回文自动机板子 或者是SAM+manacher+倍增,就是manacher求本质不同回文串(让f++的串),然后在SAM倍增查询对应点出现次数 #include<iostream> #in ...
- ●BZOJ 3676 [Apio2014]回文串
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3676 题解: 后缀数组,Manacher,二分 首先有一个结论:一个串的本质不同的回文串的个 ...
- BZOJ 3676 [Apio2014]回文串(回文树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3676 [题目大意] 考虑一个只包含小写拉丁字母的字符串s. 我们定义s的一个子串t的& ...
随机推荐
- PHP 常见问题3
1,Http 和 Https 的区别 第一:http 是超文本传输协议,信息是明文传输,https 是具有安全性的 ssl 加密传输协议 第二:http 和 https 使用的是完全不同的连接方式,端 ...
- SQL SERVER 2012 第五章 创建和修改数据表 の CREATE语句
CREATE <object type> <object name> CREATE DATABASE <database name> 比较完整的语法列表: 日志文件 ...
- 从零开始写STL-string类型
class string { public: typedef size_t size_type; typedef char* iterator; typedef char value_type; pr ...
- hdu——3861 The King’s Problem
The King’s Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- Spring中使用byType实现Beans自动装配
以下内容引用自http://wiki.jikexueyuan.com/project/spring/beans-auto-wiring/spring-autowiring-byType.html: 此 ...
- cppcon
https://cppcon.org/ https://github.com/cppcon
- CEF3研究(四)之javascript集成
一.介绍 谷歌浏览器和CEF使用V8JavaScript Engine作为内容的JavaScript实现.在浏览器中的每个窗口都有它自己在的JS上下文提供作用域和在窗口中安全的执行JS代码.CEF暴露 ...
- How do I know which version of Javascript I'm using?
Click on this link to see which version your BROWSER is using: http://jsfiddle.net/Ac6CT/ You should ...
- There is no PasswordEncoder mapped for the id "null"
There is no PasswordEncoder mapped for the id "null" 学习了:https://blog.csdn.net/dream_an/ar ...
- CentOS7 设置系统时间
在CentOS 6版本,时间设置有date.hwclock命令, 硬件时钟和系统时钟 (1) 硬件时钟 RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会 ...