来一份模板

 #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. send-mail: fatal: parameter inet_interfaces: no local interface found for ::1

    转载:http://blog.csdn.net/csdnones/article/details/50717934 发送邮件: [root@iZ23whn33jnZ log]# echo '这是邮件标 ...

  2. iOS开发--URL中汉字出现乱码

    NSURL *nurl=[[NSURL alloc] initWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF ...

  3. Oracle APEX 4.2安装和配置

    A standard Oracle 11.2.0.3 database installation comes bundled with Application Express (APEX) 3.2.1 ...

  4. 【转载】TCP和TCP/IP的区别

    TCP/IP协议(Transmission Control Protocol/Internet Protocol)叫做传输控制/网际协议, 又叫网络通讯协议,这个协议是Internet国际互联网络的基 ...

  5. Kemans算法及其Python 实现

    算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就 ...

  6. 在myeclipse下面创建多层包

    比如animal.cat.dog包 先创建animal包 然后创建animal.cat包 最后创建animal.cat.dog包 最后你发现这三个文件夹是分层的,层层嵌套的三个文件夹,而不是一个文件夹 ...

  7. 深入理解Java执行时数据区

    前情回想 在本专栏的前12篇博客中. 我们主要大致介绍了什么是JVM, 而且具体介绍了class文件的格式. 对于深入理解Java, 或者深入理解运行于JVM上的其它语言, 深入理解class文件格式 ...

  8. XMU 1612 刘备闯三国之桃园结义 【二分】

    1612: 刘备闯三国之桃园结义 Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 181  Solved: 12[Submit][Status][We ...

  9. Email格式验证

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <html ...

  10. mysql11---主键普通全文索引

    .1主键索引添加 当一张表,把某个列设为主键的时候,则该列就是主键索引 create table aaa (id int unsigned primary key auto_increment , n ...