洛谷 P3804 【模板】后缀自动机
来一份模板
#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 【模板】后缀自动机的更多相关文章
- 洛谷 P3804 [模板] 后缀自动机
题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊. 代码如下: #include<cstdio> #include ...
- 【后缀自动机】洛谷P3804模板题
题目描述 给定一个只包含小写字母的字符串SSS, 请你求出 SSS 的所有出现次数不为 111 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SSS ...
- 洛谷 P1368 工艺 后缀自动机 求最小表示
后缀自动机沙茶题 将字符串复制一次,建立后缀自动机. 在后缀自动机上贪心走 $n$ 次即可. Code: #include <cstdio> #include <algorithm& ...
- 洛谷.3809.[模板]后缀排序(后缀数组 倍增) & 学习笔记
题目链接 //输出ht见UOJ.35 #include<cstdio> #include<cstring> #include<algorithm> const in ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷 P3804 【模板】后缀自动机 统计单词出现次数
后缀自动机模板题. 关键时求解每个节点的 $right$ 大小. 由于后缀自动机在构建时会保证点和点的 $right$ 只可能没有交集,或者一个是另一个的真子集,我们可以不重复的对 $right$ 进 ...
- 洛谷P3804 【模板】后缀自动机
题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...
- 洛谷 P3804 后缀自动机
题目描述 给定一个只包含小写字母的字符串SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串SS 输出 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
随机推荐
- 【Nginx】http模块的数据结构
定义fttp模块方式很简单,比如:ngx_module_t ngx_http_mytest_module; 其中,ngx_module_t是一个Nginx模块的数据结构. typedef struct ...
- [正在学习开发板]分享--- iTOP-4412移植CAN
首先拷贝迅为提供的 libcanjni.tar.gz 压缩包到 android 源代码的"iTop4412_ICS/device/samsung/common"文件夹以下,然后使用 ...
- 磁盘显示为GPT(保护分区)
问题描述:PE进入系统,在计算机管理里面磁盘显示为GPT(保护分区).此时硬盘是不能重新分区或者格式化的. 解决思路:低版本的WIndows(PE)是不支持GPT分区的,我们需要使用系统自带的Disk ...
- 创立一个站点的前前后后(起因,域名,云平台,备案,CDN等等)(1)
起因 写完<完美软件开发:方法与逻辑>这书后,原本想继续写书的,可出来參加了些社区活动后,我发现我写的书大家评价还行.但事实上不太理解.而接下来想写的书更加抽象点.准备叫<管理的解析 ...
- 【LeetCode-面试算法经典-Java实现】【066-Plus One(加一)】
[066-Plus One(加一)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a non-negative number represented as ...
- 性能监控 -- 中间件性能监控【Weblogic控制台】
通过WebLogic管理控制台可以实时获取各性能指标,通过控制台,可以对weblogic的性能及运行状况,发布的应用.资源等进行监视 1. 进入Weblogic管理控制台,单击服务器,选择一台需监控的 ...
- 积跬步,聚小流------Bootstrap学习记录(3)
响应式作为Bootstrap的一大特色.栅格系统可谓是功不可没,既然如此,那我们就来看一下栅格系统是怎样帮助bootstrap实现响应式布局的呢? 1.什么是栅格系统 我们能够从Bootstrap的官 ...
- 怎样将查询到的数据显示在DataGridView中
背景介绍: 数据库中的T_Line_Info表中存放着学生上机的记录,也就是我们须要查询上机记录的表.当中详细内容为: 界面设计例如以下: watermark/2/text/aHR0cDovL2Jsb ...
- UIButton的图片和文字相对位置调整
通常.假设直接设置UIButton的图片和文字,默认的两者相对位置可能不是我们想要的,那么须要进行调整. 须要用到的函数例如以下: UIEdgeInsetsMake(CGFloat top, CGFl ...
- 给GridView设置行高
近期在工作中遇到了这样一个问题,使用一个GridView展示数据,item中仅仅是一个TextView,可是里面显示的文字多少不固定多少,必须所有展示出来. 遇到的问题: 1.把item中的宽和高设置 ...