来一份模板

 #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. 学习swift从青铜到王者之swift闭包06

    语法表达式 一般形式:{ (parameters) -> returnType in statements } 这里的参数(parameters),可以是in-out(输入输出参数),但不能设定 ...

  2. CTEX - 在线文档 - TeX/LaTeX 常用宏包

    CTEX - 在线文档 - TeX/LaTeX 常用宏包       页面与章节标题式样   浮动对象及标题设计   生成与插入图形   表格与列表   目录与索引   参考文献   数学与化学公式 ...

  3. Java多线程导致的的一个事物性问题

    业务场景 我们如今有一个类似于文件上传的功能.各个子网站接受业务,业务上传文件,各个子网站的文件须要提交到总网站保存.文件是按批次提交到总网站的,也就是说,一个批次以下约有几百个文件. 考虑到白天提交 ...

  4. Office EXCEL 如何设置最大行高

    对于单个单元格行来说,行高必须在0-409之间   但是如果合并了两个单元格,则行高就扩展了一倍,不止409,而是两倍的409.

  5. 【求建议】毕业之声——信院IT类毕业学子经验分享交流会

    一:缘由 在和非常多学子交流,及上课的经历中,发现一个非常普遍的现象:部分大一学生即失去了对学习.对专业的兴趣.有人在迷茫之后奋起直追.从而珍惜利用不多的大学时光努力提高自己.有人在迷茫中沉沦,沉迷于 ...

  6. UICollectionView 具体解说学习

    UICollectionView 和UITableView非常像,是APPLE公司在iOS 6后推出的用于处理图片这类UITableView 布局困难的控件,和UITableView 一样,它也有自己 ...

  7. Ubuntu14.04常用安装

    sudo apt-get update sudo apt-get install flashplugin-nonfree ================= 类飞秋软件 sudo apt-get in ...

  8. WPF的WebBrowser屏蔽弹出脚本错误窗体

    WPF自带的WebBrowser在訪问一些有问题的网页时常常跳出非常多提示脚本错误的窗体, 可是WPF没有自带屏蔽这些窗体的方法或属性. 所以网上找来一使用反射的方法来屏蔽弹出脚本错误窗体的方法, 非 ...

  9. oracle安装登录sqlplus / as sysdba然后报错ERROR: ORA-01031 insufficient privileges

    解决办法: 一般情况下检查操作系统的登录用户是否包含在ORA_DBA组中. 控制面板->管理工具->计算机管理->系统工具->本地用户和组->ORA_DBA组. 如果OR ...

  10. Linux进程间通信——使用信号量【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10243617 这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号 ...