出现次数很好处理,就是 \(right/endpos\) 集合的大小

那么,直接构建 \(SAM\)

求出每个位置的\(right\)集合大小

直接更新每个节点的\(longest\)就行了

最后短的可以由长的更新过来就好

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 2001000
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
char ch[MAX];
struct Node
{
int son[26];
int ff,len;
}t[MAX<<1];
int size[MAX];
int tot=1,last=1,c[MAX],a[MAX],ans[MAX];
void extend(int c)
{
int p=last,np=++tot;last=np;
t[np].len=t[p].len+1;
while(p&&!t[p].son[c])t[p].son[c]=np,p=t[p].ff;
if(!p)t[np].ff=1;
else
{
int q=t[p].son[c];
if(t[q].len==t[p].len+1)t[np].ff=q;
else
{
int nq=++tot;
t[nq]=t[q];
t[nq].len=t[p].len+1;
t[q].ff=t[np].ff=nq;
while(p&&t[p].son[c]==q)t[p].son[c]=nq,p=t[p].ff;
}
}
size[np]=1;
}
int main()
{
scanf("%s",ch+1);
int l=strlen(ch+1);
for(int i=1;i<=l;++i)extend(ch[i]-97);
for(int i=1;i<=tot;++i)c[t[i].len]++;
for(int i=1;i<=tot;++i)c[i]+=c[i-1];
for(int i=1;i<=tot;++i)a[c[t[i].len]--]=i;
for(int i=tot;i;--i)
{
int u=a[i];
size[t[u].ff]+=size[u];
ans[t[u].len]=max(ans[t[u].len],size[u]);
}
for(int i=l-1;i;--i)ans[i]=max(ans[i],ans[i+1]);
for(int i=1;i<=l;++i)printf("%d\n",ans[i]);
return 0;
}

最新文章

  1. android nio
  2. C#实现jQuery的方法连缀
  3. 一个简单的Android富文本TextView实现
  4. Spider爬虫清洗数据(re方法)
  5. Xcode6.4注册URL Scheme步骤详解
  6. ZOJ 1109 Language of FatMouse
  7. Linux常用指令---tar | zip (解压缩)
  8. jQuery之load、unload、onunload和onbeforeunload
  9. 感知机学习算法 python实现
  10. HDU4675【GCD of scequence】【组合数学、费马小定理、取模】
  11. PrintWriter的println问题
  12. HDU 5114 Collision
  13. 如何实现一个malloc函数
  14. 安装mysqlsla性能分析工具
  15. ubuntu Linux离线安装软件包
  16. SQL Server数据库视图
  17. VAO VBO IBO大乱炖
  18. Oracle的实例恢复解析
  19. testng报告-extentsReports使用-klov
  20. last与lastb命令 读取的日志文件

热门文章

  1. sql中使用timestamp增量抽取数据
  2. python基础-文本操作
  3. Git_学习_02_ 分支
  4. Posix线程编程指南(3)
  5. 【Lintcode】120.Word Ladder
  6. 描述怎样通过flask+redis+sqlalchemy等工具,开发restful api
  7. Thrift之TProcess类体系原理及源码详细解析
  8. AGC600 C Rabbit Exercise —— 置换
  9. 洛谷P1144——最短路计数
  10. Python3解leetcode Maximum Subarray