分析

TJOI白给题

建出sam,对于每个点如果它的子树siz和等于k

那么对于这个满足的点它有贡献的长度一定是一个连续区间

直接差分即可

代码

#include<bits/stdc++.h>
using namespace std;
int n,k,mx,ans,d[];
char s[];
struct SAM {
int mp[][],fa[],ed,ccnt,len[],siz[];
int head[],nxt[],to[],cnt;
inline void init(){
mx=;
cnt=ans=;
ccnt=ed=;
memset(d,,sizeof(d));
memset(mp,,sizeof(mp));
memset(fa,,sizeof(fa));
memset(to,,sizeof(to));
memset(len,,sizeof(len));
memset(siz,,sizeof(siz));
memset(nxt,,sizeof(nxt));
memset(head,,sizeof(head));
}
inline void add(int x,int y){
nxt[++cnt]=head[x];
head[x]=cnt;
to[cnt]=y;
}
inline void ins(int x,int n1){
int p=ed;
ed=++ccnt;
siz[ccnt]=;
len[ccnt]=n1;
while(p&&!mp[p][x]){
mp[p][x]=ed;
p=fa[p];
}
if(!p){
fa[ed]=;
return;
}
int q=mp[p][x];
if(len[q]==len[p]+){
fa[ed]=q;
return;
}
len[++ccnt]=len[p]+;
for(int i=;i<=;i++)mp[ccnt][i]=mp[q][i];
fa[ccnt]=fa[q];
fa[q]=ccnt;
fa[ed]=ccnt;
for(int i=p;mp[i][x]==q;i=fa[i])mp[i][x]=ccnt;
}
inline void build(){
for(int i=;i<=ccnt;i++)add(fa[i],i);
}
inline void dfs(int x){
for(int i=head[x];i;i=nxt[i])
dfs(to[i]),siz[x]+=siz[to[i]];
if(siz[x]==k&&len[fa[x]]+<=len[x])d[len[fa[x]]+]++,d[len[x]+]--;
}
};
SAM sam;
int main(){
int i,j,t;
scanf("%d",&t);
while(t--){
sam.init();
scanf("%s",s+);
n=strlen(s+);
scanf("%d",&k);
for(i=;i<=n;i++)sam.ins(s[i]-'a'+,i);
sam.build();
sam.dfs();
for(i=;i<=n;i++){
d[i]+=d[i-];
if(d[i]&&d[i]>=mx){
mx=d[i];
ans=i;
}
}
printf("%d\n",ans?ans:-);
}
return ;
}

p5341 [TJOI2019]甲苯先生和大中锋的字符串的更多相关文章

  1. 洛谷P5341 [TJOI2019]甲苯先生和大中锋的字符串

    原题链接P5341 [TJOI2019]甲苯先生和大中锋的字符串 题目描述 大中锋有一个长度为 n 的字符串,他只知道其中的一个子串是祖上传下来的宝藏的密码.但是由于字符串很长,大中锋很难将这些子串一 ...

  2. 【题解】Luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串

    原题传送门 实际按照题意模拟就行 我们先求出字符串的sa 因为要在字符串中出现k次,所以我们枚举\(l,r(r-l+1=k)\)看一共有多少种合法的方案 合法方案的长度下界\(lb\)为\(Max(h ...

  3. luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串

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

  4. [TJOI2019]甲苯先生和大中锋的字符串——后缀自动机+差分

    题目链接: [TJOI2019]甲苯先生和大中锋的字符串 对原串建后缀自动机并维护$parent$树上每个点的子树大小,显然子树大小为$k$的节点所代表的子串出现过$k$次,那么我们需要将$[len[ ...

  5. 【洛谷 P5341】 [TJOI2019]甲苯先生和大中锋的字符串(后缀自动机)

    题目链接 建出\(sam\),求出parent tree上每个点的\(endpos\)集合大小. 如果等于\(k\),说明到达这个点的都可以.给\((len[fa(i)],len[i]]\)的\(cn ...

  6. Tjoi2019 甲苯先生和大中锋的字符串 后缀自动机_差分

    tjoi胆子好大,直接出了两道送分题...... 都 9102 年了,还有省选出模板题QAQ...... Code: #include <bits/stdc++.h> #define se ...

  7. [TJOI2019]甲苯先生和大中锋的字符串

    有个叫asuldb的神仙来嘲讽我 说这题SAM水题,而且SA过不了 然后我就用SA过了 显然是一个Height数组上长为k的滑块,判一下两边,差分一下就可以了 #include"cstdio ...

  8. [TJOI2019]大中锋的游乐场——最短路+DP

    题目链接: [TJOI2019]大中锋的游乐场 题目本质要求的还是最短路,但因为有第二维权值(汽水看成$+1$,汉堡看成$-1$)的限制,我们在最短路的基础上加上一维$f[i][j]$表示到达$i$节 ...

  9. [TJOI2019]甲苯先生的滚榜——非旋转treap

    题目链接: [TJOI2019]甲苯先生的滚榜 要求维护一个二维权值的集合并支持单点修改,用平衡树维护即可. 因为$n\le 10^6$但$m\le 10^5$,所以最多只有$10^5$个人被操作. ...

随机推荐

  1. 应用安全-Web安全-SSRF攻防

    原理 服务器: IP:.XX.191.14 nc -l -p 客户端: http://xx.map.xx.com/maps/services/thumbnails?width=215&heig ...

  2. c++中关于类的长度的猜想

    在无意中,我偶然发现了类的长度并不是由函数的类型及个数决定,也并非是2的倍数.4的倍数. 在翻阅资料中,我得出了一些我认为可能的猜想. 我们先来看一串代码 #include<iostream&g ...

  3. 通过挂载系统U盘搭建本地yum仓库

    首先打开hbza(CentOS)和yum,两者要连接上 第1步:在hbza中创建一个目录 输入mkdir /lxk,名字随便起.输入mount  /dev/cdrom  /lxk 第2步:打开yum, ...

  4. 【sql server复制】不重新初始化快照的情况下新增表/存储过程/函数等

    转发自:https://www.cnblogs.com/datazhang/p/5498789.html sqlserver同步后在不重新初始化快照的情况下新增表        在已有事务复制中,时长 ...

  5. [常用类]Number & Math 类(转载)

    下面的表中列出的是 Number & Math 类常用的一些方法: 序号 方法与描述 1 xxxValue() 将 Number 对象转换为xxx数据类型的值并返回. 2 compareTo( ...

  6. (六:NIO系列) 相关设计模式

    出处:  反应器模式 vs 观察者模式  反应器模式 vs 生产者消费者模式 反应器模式 vs 观察者模式 反应器模式 是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式.当请求抵达 ...

  7. menustrip

    在对应菜单上点击鼠标右键,插入,SEPARATOR 就可以了,然后可以选中拖动位置.

  8. vue v-model 的使用

    Vue的核心特性之一是双向绑定,vue的响应式原理是实现了数据->视图 v-bind只能实现数据的单向绑定 ,从M自动绑定到V 使用v-model 可以实现表单元素的双向绑定,且只能应用到表单元 ...

  9. Python之路-pandas包的详解与使用

    什么是pandas pandas是一种Python数据分析的利器,是一个开源的数据分析包,最初是应用于金融数据分析工具而开发出来的,因此pandas为时间序列分析提供了很好的支持.pandas是PyD ...

  10. vue实现搜索功能

    vue实现搜索功能 template 部分 <!-- 搜索页面 --> <template> <div> <div class="goback&qu ...