来一份模板

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
typedef long long LL;
char s[];
int n;
LL ans;
namespace SAM
{
int mem,np,root;
int len[],par[];
int trans[][];
int in[],sz[];
void append(int ch)
{
int p=np;np=++mem;len[np]=len[p]+;
for(;p&&!trans[p][ch];p=par[p]) trans[p][ch]=np;
if(!p) par[np]=root;
else
{
int q=trans[p][ch];
if(len[q]==len[p]+) par[np]=q;
else
{
int nq=++mem;par[nq]=par[q];par[q]=par[np]=nq;
memcpy(trans[nq],trans[q],sizeof(trans[nq]));len[nq]=len[p]+;
for(;p&&trans[p][ch]==q;p=par[p]) trans[p][ch]=nq;
}
}
sz[np]=;
}
void build()
{
np=root=++mem;
for(int i=;i<=n;i++) append(s[i]-'a');
}
queue<int> q;
void work()
{
int i,t;
for(i=;i<=mem;i++) ++in[par[i]];
for(i=;i<=mem;i++)
if(!in[i])
q.push(i);
while(!q.empty())
{
t=q.front();q.pop();
if(sz[t]>) ans=max(ans,LL(sz[t])*len[t]);
if(par[t])
{
sz[par[t]]+=sz[t];
--in[par[t]];
if(!in[par[t]]) q.push(par[t]);
}
}
}
} int main()
{
scanf("%s",s+);n=strlen(s+);
SAM::build();SAM::work();
printf("%lld",ans);
return ;
}

还有后缀数组强行A此题

 #pragma GCC optimize("Ofast")
#pragma GCC target("sse3","sse2","sse")
#pragma GCC target("avx","sse4","sse4.1","sse4.2","ssse3")
#pragma GCC target("f16c")
#pragma GCC optimize("inline","fast-math","unroll-loops","no-stack-protector")
#pragma GCC diagnostic error "-fwhole-program"
#pragma GCC diagnostic error "-fcse-skip-blocks"
#pragma GCC diagnostic error "-funsafe-loop-optimizations"
#pragma GCC diagnostic error "-std=c++14"
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
char s[];
int n;
namespace SA
{
int sa[],t1[],t2[],m='z',cnt[],p;
int *x=t1,*y=t2,*rk=t1,*height=t2;
template<typename T>
T get(int pos,T *a)
{
return pos<=n?a[pos]:;
}
void build()
{
int i,k;int *it,*ed;
for(i=;i<=n;++i) ++cnt[x[i]=s[i]];
for(it=cnt+,ed=cnt+m+;it!=ed;++it) *it+=*(it-);
for(i=n;i>=;--i) sa[cnt[x[i]]--]=i;
for(k=;k<=n;k<<=)
{
p=;
for(i=n-k+;i<=n;++i) y[++p]=i;
for(i=;i<=n;++i) if(sa[i]>k) y[++p]=sa[i]-k;
for(it=cnt+,ed=cnt+m+;it!=ed;++it) *it=;
for(i=;i<=n;++i) cnt[x[y[i]]]++;
for(it=cnt+,ed=cnt+m+;it!=ed;++it) *it+=*(it-);
for(i=n;i>=;--i) sa[cnt[x[y[i]]]--]=y[i];
swap(x,y);p=;
for(i=;i<=n;++i)
x[sa[i]]=y[sa[i]]==y[sa[i-]]&&get(sa[i]+k,y)==get(sa[i-]+k,y)
?p:++p;
if(p>=n) break;
m=p;
}
for(i=;i<=n;++i) rk[sa[i]]=i;
for(i=,k=;i<=n;++i)
{
if(k) k--;
if(rk[i])
while(get(sa[rk[i]-]+k,s)==get(i+k,s)) k++;
height[rk[i]]=k;
}
}
}
int sz[],fa[];
int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
typedef pair<int,int> P;
typedef long long LL;
P tmp[];
LL ans;
bool cmp(const P& a,const P& b)
{
return a>b;
}
int main()
{
int i,d,t,fx,fy;
scanf("%s",s+);n=strlen(s+);SA::build();
for(i=;i<=n;i++) fa[i]=i,sz[i]=;
for(i=;i<=n;i++) tmp[i]=P(SA::height[i],i);
sort(tmp+,tmp+n+,cmp);
for(i=;i<=n;i++)
{
d=tmp[i].first;t=tmp[i].second;
fx=find(t-);fy=find(t);
sz[fy]+=sz[fx];fa[fx]=fy;
ans=max(ans,LL(sz[fy])*d);
}
printf("%lld",ans);
return ;
}

以下是作死用map之后T掉的程序

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
using namespace std;
typedef long long LL;
char s[];
int n;
LL ans;
namespace SAM
{
int mem,np,root;
int len[],par[];
map<int,int> trans[];
int in[],sz[];
void append(int ch)
{
int p=np;np=++mem;len[np]=len[p]+;
for(;p&&!trans[p].count(ch);p=par[p]) trans[p][ch]=np;
if(!p) par[np]=root;
else
{
int q=trans[p][ch];
if(len[q]==len[p]+) par[np]=q;
else
{
int nq=++mem;par[nq]=par[q];par[q]=par[np]=nq;
trans[nq]=trans[q];len[nq]=len[p]+;
for(;p&&trans[p].count(ch)&&trans[p][ch]==q;p=par[p]) trans[p][ch]=nq;
}
}
sz[np]=;
}
void build()
{
np=root=++mem;
for(int i=;i<=n;i++) append(s[i]-'a');
}
queue<int> q;
void work()
{
int i,t;
for(i=;i<=mem;i++) ++in[par[i]];
for(i=;i<=mem;i++)
if(!in[i])
q.push(i);
while(!q.empty())
{
t=q.front();q.pop();
if(sz[t]>) ans=max(ans,LL(sz[t])*len[t]);
if(par[t])
{
sz[par[t]]+=sz[t];
--in[par[t]];
if(!in[par[t]]) q.push(par[t]);
}
}
}
} int main()
{
scanf("%s",s+);n=strlen(s+);
SAM::build();SAM::work();
printf("%lld",ans);
return ;
}

洛谷 P3804 【模板】后缀自动机的更多相关文章

  1. 洛谷 P3804 [模板] 后缀自动机

    题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...

  2. 【后缀自动机】洛谷P3804模板题

    题目描述 给定一个只包含小写字母的字符串SSS, 请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SSS ...

  3. 洛谷 P1368 工艺 后缀自动机 求最小表示

    后缀自动机沙茶题 将字符串复制一次,建立后缀自动机. 在后缀自动机上贪心走 $n$ 次即可. Code: #include <cstdio> #include <algorithm& ...

  4. 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记

    题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...

  5. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  6. 洛谷 P3804 【模板】后缀自动机 统计单词出现次数

    后缀自动机模板题. 关键时求解每个节点的 $right$ 大小. 由于后缀自动机在构建时会保证点和点的 $right$ 只可能没有交集,或者一个是另一个的真子集,我们可以不重复的对 $right$ 进 ...

  7. 洛谷P3804 【模板】后缀自动机

    题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...

  8. 洛谷 P3804 后缀自动机

    题目描述 给定一个只包含小写字母的字符串SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SS 输出 ...

  9. 【AC自动机】洛谷三道模板题

    [题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...

  10. 洛谷-P5357-【模板】AC自动机(二次加强版)

    题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...

随机推荐

  1. HDOJ 5384 Danganronpa AC自己主动机

     AC自己主动机裸题 Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java ...

  2. [RxJS] Implement the `map` Operator from Scratch in RxJS

    While it's great to use the RxJS built-in operators, it's also important to realize you now have the ...

  3. HDU 5285 wyh2000 and pupil(dfs或种类并查集)

    wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Other ...

  4. web.xml文件中各个配置的说明

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...

  5. HDU 1824 Let&#39;s go home (2-SAT判定)

    Let's go home Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  6. oracle的日期蛋

    一切都是扯鸡巴蛋. 在网上查oracle的日期函数用法,得到一大堆语法,林林总总,都是扯鸡巴蛋,没能解决我的问题. 其实,我想写这么一条语句:查找某个日期(不含时分秒)产生或有关的记录.咋写? SQL ...

  7. apache使用总结

    由于某些原因,经常会使用apache(有时用nginx) 现在我主要用它做反向代理,偶尔弄一下负载均衡和添加head头 apache官网 http://httpd.apache.org/ 下载地址 h ...

  8. [m() for i in range(8)]

    import time def m(): print(time.time()) time.sleep(1) [m() for i in range(8)] 一行 list

  9. Semantic Parsing(语义分析) Knowledge base(知识图谱) 对用户的问题进行语义理解 信息检索方法

    简单说一下所谓Knowledge base(知识图谱)有两条路走,一条是对用户的问题进行语义理解,一般用Semantic Parsing(语义分析),语义分析有很多种,比如有用CCG.DCS,也有用机 ...

  10. myqsl02

    常用的表的引擎 Myisam ,批量插入速度快, 不支持事务,锁表 Innodb, 批量插入相对较慢,支持事务,锁行. 全文索引:目前5.5版本,myisam,innodb都已经支持 关于事务的引擎: ...