传送门

考虑子串以及出现个数,可以发现SAM可以快速知道每种子串的出现次数,即所在状态的\(endpos\)集合大小,然后一个状态对应的子串长度是一段连续区间,所以可以对每个状态差分一下,就能统计答案了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db double using namespace std;
const int N=2e5+10;
/*int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}*/ //垃圾luogu数据卡读优
int to[N],nt[N],hd[N],tot;
void add(int x,int y)
{
++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;
}
char cc[N];
int n,kk,b[N],la,tt,fa[N],ch[N][26],len[N],sz[N];
int newnode(){++tt,fa[tt]=len[tt]=sz[tt]=0;memset(ch[tt],0,sizeof(int)*26);return tt;}
void extd(int x)
{
int np=newnode(),p=la;
len[np]=len[p]+1,sz[np]=1,la=np;
while(p&&!ch[p][x]) ch[p][x]=np,p=fa[p];
if(!p) fa[np]=1;
else
{
int q=ch[p][x];
if(len[q]==len[p]+1) fa[np]=q;
else
{
int nq=newnode();
fa[nq]=fa[q],len[nq]=len[p]+1,memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[np]=fa[q]=nq;
while(p&&ch[p][x]==q) ch[p][x]=nq,p=fa[p];
}
}
}
void dfs(int x)
{
for(int i=hd[x];i;i=nt[i])
dfs(to[i]),sz[x]+=sz[to[i]];
if(sz[x]==kk) ++b[len[fa[x]]+1],--b[len[x]+1];
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",cc+1);
n=strlen(cc+1);
scanf("%d",&kk);
for(int i=1;i<=n;++i) b[i]=0;
la=1,tt=0,newnode();
for(int i=1;i<=n;++i) extd(cc[i]-'a');
memset(hd,0,sizeof(int)*(tt+3)),tot=0;
for(int i=2;i<=tt;++i) add(fa[i],i);
dfs(1);
int ans=-1,ma=0;
for(int i=1;i<=n;++i) b[i]+=b[i-1];
for(int i=n;i;--i)
if(ma<b[i]) ma=b[i],ans=i;
printf("%d\n",ans);
}
return 0;
}

最新文章

  1. Github使(zhuang)用(bi)指南
  2. Vue.js入门
  3. java模拟post请求发送json
  4. 响应式疑惑? CSS单位研究
  5. 【转载】Understand the serialVersionUID
  6. TIB自动化测试快讯 - Appium手机自动化测试学习资料精选
  7. Java 进程(转)
  8. redis 笔记06 发布与订阅、事务、慢查询日志、监视器
  9. zookeeper系列之十一—zookeeper会话超时
  10. unset是不能清除保存在本地电脑上的cookie的,用于session就可以(弄了半天原来是这样)
  11. Q_INVOKABLE与invokeMethod用法全解
  12. [kuangbin带你飞]专题十 匹配问题 二分图多重匹配
  13. atitit。浏览器缓存机制 and 微信浏览器防止缓存的设计 attilax 总结
  14. codeforces 372E. Drawing Circles is Fun
  15. Linux下C的线程同步机制
  16. 由浅入深理解Java线程池及线程池的如何使用
  17. Education CodeForces Round 63 Div.2
  18. Linux支持ntfs,exfat格式文件系统
  19. windows环境:idea或者eclipse指定用户名操作hadoop集群
  20. 周强 201771010141《面对对象程序设计(java)》第十周学习总结

热门文章

  1. line-height与vertical-align:简单的属性不简单
  2. 【学习】linux环境下nginx文件彻底删除
  3. Excel中使用Power Query获取网页json数据
  4. Is JavaScript a pass-by-reference or pass-by-value language?
  5. centos6 升级php版本
  6. Tensorflow所遇坑
  7. [VBA]汇总多个工作簿的指定工作表到同一个工作簿的指定工作表中
  8. 创建的项目如果没有src/main/resources文件夹,如何解决?
  9. Dojo入门:增强的Ajax功能
  10. javase程序设计上机作业1