tjoi胆子好大,直接出了两道送分题......

都 9102 年了,还有省选出模板题QAQ......

Code:

#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 200010
using namespace std;
char str[maxn];
int n,C[maxn],rk[maxn],arr[maxn];
int dis[maxn],f[maxn],ch[maxn][30],last,tot,cnt[maxn];
void init() { last = tot = 1; }
void ins(int c){
int np = ++tot, p = last;
last = np, dis[np] = dis[p] + 1;
while(p && !ch[p][c]) ch[p][c] = np, p = f[p];
if(!p) f[np] = 1;
else {
int q = ch[p][c];
if(dis[q] == dis[p] + 1) f[np] = q;
else {
int nq = ++tot;
dis[nq] = dis[p] + 1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
f[np] = nq, f[nq] = f[q], f[q] = nq;
while(p && ch[p][c] == q) ch[p][c] = nq, p = f[p];
}
}
++cnt[np];
}
void work()
{
int k;
init();
scanf("%s%d",str + 1,&k), n = strlen(str + 1);
for(int i = 1;i <= n; ++i) ins(str[i] - 'a');
for(int i = 1;i <= tot; ++i) ++C[dis[i]];
for(int i = 1;i <= tot; ++i) C[i] += C[i - 1];
for(int i = tot;i >= 1; --i) rk[C[dis[i]]--] = i;
for(int i = tot;i >= 1; --i) {
int u = rk[i];
cnt[f[u]] += cnt[u];
if(cnt[u] == k)
{
arr[dis[f[u]] + 1] += 1;
arr[dis[u] + 1] -= 1;
}
}
int ans = 0, p = 0;
for(int i = 1;i <= tot; ++i) {
arr[i] += arr[i - 1];
if(arr[i] >= p && arr[i] != 0) ans = i, p = arr[i];
}
if(ans == 0)
printf("-1\n");
else
printf("%d\n",ans);
for(int i = 0;i <= tot; ++i)
{
for(int j = 0;j < 30; ++j) ch[i][j] = 0;
cnt[i] = C[i] = arr[i] = 0;
}
last = tot = 0;
}
int main()
{
// setIO("input");
int T;
scanf("%d",&T);
while(T--) work();
return 0;
}

  

Tjoi2019 甲苯先生和大中锋的字符串 后缀自动机_差分的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    分析 TJOI白给题 建出sam,对于每个点如果它的子树siz和等于k 那么对于这个满足的点它有贡献的长度一定是一个连续区间 直接差分即可 代码 #include<bits/stdc++.h&g ...

  8. 模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)

    模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合) Code: #include <bits/stdc++.h> using namespace std; #define ...

  9. bzoj3756pty的字符串(后缀自动机+计数)

    题目描述 题解 我们可以先对trie树建出广义SAM,然后维护一下right集合大小(注意right集合在广义SAM上的维护方式). 然后把匹配穿往广义SAM上匹配,假设现在匹配到了x节点,那么x的所 ...

随机推荐

  1. Java反射获取class对象的三种方式,反射创建对象的两种方式

    Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName ...

  2. orcale 基本查询(1)

    orcale 基本查询 查询当前用户下的所有表:  select * from tab; 查询表结构: desc 表名设置行宽: set linesize 120;设置列宽: 数值类型: col 列名 ...

  3. Linux查看文件内容命令:more(转)

    Linux more命令类似cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按b键就会往回(back)一页显示,而且还有搜寻字串的功 ...

  4. POJ 1175

    //本来写了个和1021相同的HASH,但没过,于是,抱着侥幸的心理,把它变成距离的四次方, //我就呵呵了... //这个题,完全靠概率.当然了,如果是把图翻转来比较,也是可以的.但好像很麻烦.. ...

  5. HDU 1240

    #include <iostream> #include <cstdio> using namespace std; ; char maze[MAX][MAX][MAX]; s ...

  6. Think In java 笔记一

    本博客不再更新,很多其它精彩内容请訪问我的独立博客 今天起要读这本书了,曾经都没有认真读过书.是时候改变自己了. 如今认为不是写不出代码,而是没有想法,没有架构,要做一个大神不是写多少代码.而是要能做 ...

  7. Qt的Socket数据通讯的一个样例。

    QTcpServer类 用来侦听port ,获取QTcpSocket. QTcpSocket有  connected的信号(已经连接),还有readyread()信号,表示已经有数据发过来了.准备读取 ...

  8. 【C语言】编写函数,将一个数的指定位置置0或置1

    //编写函数,将一个数的指定位置置0或置1 #include <stdio.h> unsigned int set_bit(unsigned int num, int pos, int f ...

  9. DNS同时占用UDP和TCP端口53——传输数据超过512时候用tcp,DNS服务器可以配置仅支持UDP查询包

    DNS同时占用UDP和TCP端口53是公认的,这种单个应用协议同时使用两种传输协议的情况在TCP/IP栈也算是个另类.但很少有人知道DNS分别在什么情况下使用这两种协议. 先简单介绍下TCP与UDP. ...

  10. 【NOIP 2009】 靶形数独

    [题目链接] https://www.luogu.org/problemnew/show/P1074 [算法] 搜索 + 剪枝 [代码] #include<bits/stdc++.h> u ...