来一份模板

 #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 ;
}

最新文章

  1. Git的checkout, reset, revert
  2. BZOJ2471 : Count
  3. Sqlite3中存储类型和数据类型结合文档解析。
  4. Spring之ResourceLoader加载资源
  5. ASP.Net MVC开发基础学习笔记(1):走向MVC模式
  6. LeetCode----66. Plus One(Java)
  7. JBPM4入门——3.JBPM4开发环境的搭建
  8. 设计模式--委托模式C++实现
  9. Java--Socket通信(双向)
  10. javascript 易漏点
  11. post 和 get 的区别,直指本质
  12. 2019-03-28-day021-抽象类与接口类
  13. js 横屏 竖屏 相关代码 与知识点
  14. java serialize 浅谈
  15. OGG日常运维监控的自动化脚本模板
  16. Python入门之Pycharm开发中最常用快捷键
  17. 论文笔记——MobileNets(Efficient Convolutional Neural Networks for Mobile Vision Applications)
  18. 从底层谈WebGIS 原理设计与实现(一):开篇
  19. VMware vCenter Converter迁移Linux系统虚拟机
  20. 当数据库的字段为date类型时候

热门文章

  1. linux安装mail服务使用外部MTA发送邮件
  2. Failed to load session “ubuntu&quot; 问题解决总结
  3. 【c++】【转】结构体字节对齐
  4. 【转】面向切面编程-AOP,挺有用的
  5. VB6 如何自定义代码字体和支持鼠标滚轮
  6. hdoj 1533 Going Home 【最小费用最大流】【KM入门题】
  7. Django:视图和URL配置
  8. mysql学习笔记之mysql数据库的安装
  9. How to: Use Submix Voices
  10. 嵌入式开发之davinci--- DVRRDK, EZSDK和DVSDK这三者有什么区别