用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. CodeForces 592C The Big Race

    公倍数之间的情况都是一样的,有循环节. 注意min(a,b)>t的情况和最后一段的处理.C++写可能爆longlong,直接Java搞吧...... import java.io.Buffere ...

  2. Python高级进阶(一)Python框架之Django入门

    传说中的Django Django由来 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下 ...

  3. 常见machine learning模型实现

    一.感知机模型 二.线性回归(Linear Regression) from numpy import * def loadData(filename): x = [] y = [] f = open ...

  4. UI 经常用法总结之--- UILabel UITextField (不断更新中)

    UILabel : UIView <NSCoding> 1.创建一个UILabel对象 UILabel *label = [[UILabel alloc]initWithFrame:CGR ...

  5. HDU3926Hand in Hand(搜索 或 并查集)

    Problem Description In order to get rid of Conan, Kaitou KID disguises himself as a teacher in the k ...

  6. 游戏server设计的一些感悟

    Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:September 30 ...

  7. C语言-- static 全局使用示例

    C语言-- static 全局使用示例  前言:看到很多使用Objective-C开发IOS的大牛,有时候会使用static全局变量,相比之下,我却很少用这个,从而很少对其有着比较有实质意义的理解,甚 ...

  8. iOS开发--常用技巧 (MJRefresh详解)

         iOS开发--常用技巧 (MJRefresh详解) https://github.com/CoderMJLee/MJRefresh 下拉刷新01-默认 self.tableView.head ...

  9. IOS报错:Unexpected ‘@’ in program

    IOS开发中出现此错误的原因: 1.宏定义重复. 我在OC与C++混编的时候,由于C++中使用到了interface,在工程中年将interface从定义为struct,当引用此接口时候出现Unexp ...

  10. oracle 12c 13姨

    搞了一下oracle 12c.有些体会还是先记下来. 12c搞搞新意思,弄了个CDB(容器数据库,可不是商务中心CBD哟)和PDB(可插拔数据库).PDB插在CDB里. 简单而言,CDB就是一个数据库 ...