原题链接

题意

  • 每个测试点,一开始给我们n,m,k然后是一个长度为n的字符串。

  • 之后m次操作,1 c是往字符串后面添加一个字符c,2是查询字符串中出现k次以及以上的子串个数,m为2e5

思路

  • 首先可以看出这是在线算法(离线其实也可以),然后是查询出现至少k次的子串,这样我们可以直接联系到后缀自动机,与我们本题的需求较为契合

  • 我们知道后缀自动机中,每个节点代表的不同子串数量为

\[cnt_v = len(v) - len(link(v))
\]
  • 而每个节点的出现次数是其本身与link树的所有子树的标记次数之和,所以每次插入一个字符之后,我们都沿着link向上更新,对沿路节点的标记+1,如果出现了加完后标记正好为k的节点,则
\[ans += len(v) - len(link(v)
\]

然后如果某个节点在访问之前就达到了k,则不需要继续向上更新了,因为上面的节点也肯定大于等于k,并且在之前就被记录了

AC代码

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; const int N = 250000; int n, m, k, last = 0, co = 0;
long long ans = 0;
char ss[N + 5]; struct Sam
{
int fl;
int len;
int fail;
int sn[26];
} sam[N * 2 + 5]; void inits(int o)
{
sam[o].fail = -1;
sam[o].len = 0;
sam[o].fl = 0;
for (int i = 0; i < 26; ++i)
{
sam[o].sn[i] = 0;
}
} void update(int o)
{
while (o > 0 && sam[o].fl < k)
{
++sam[o].fl;
if (sam[o].fl >= k)
{
ans += sam[o].len - sam[sam[o].fail].len;
}
o = sam[o].fail;
}
} void add(char c)
{
int noww = ++co;
inits(noww);
sam[noww].len = sam[last].len + 1;
int p = last;
while (p != -1 && !sam[p].sn[c - 'a'])
{
sam[p].sn[c - 'a'] = noww;
p = sam[p].fail;
}
if (p == -1)
{
sam[noww].fail = 0;
}
else
{
int q = sam[p].sn[c - 'a'];
if (sam[q].len == sam[p].len + 1)
{
sam[noww].fail = q;
}
else
{
int cp = ++co;
sam[cp] = sam[q];
sam[cp].len = sam[p].len + 1;
// sam[cp].fl = 0; sam[q].fail = cp;
sam[noww].fail = cp;
while (p != -1 && sam[p].sn[c - 'a'] == q)
{
sam[p].sn[c - 'a'] = cp;
p = sam[p].fail;
}
}
}
last = noww;
update(noww);
} int main()
{
while (scanf("%d%d%d", &n, &m, &k) == 3)
{
co = 0;
last = 0;
scanf("%s", ss);
ans = 0;
inits(0);
for (int i = 0; ss[i]; ++i)
{
add(ss[i]);
}
for (int i = 1; i <= m; ++i)
{
int opt;
scanf("%d", &opt);
if (opt == 1)
{
char c[5];
scanf("%s", c);
add(c[0]);
}
else
{
printf("%lld\n", ans);
}
}
}
return 0;
}

HDU 4641 K string 后缀自动机的更多相关文章

  1. HDU 4622 Reincarnation(后缀自动机)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4622 [题目大意] 给出一个长度不超过2000的字符串,有不超过10000个询问,问[L,R]子串 ...

  2. HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)

    Problem Description In this problem, you are given several strings that contain only digits from '0' ...

  3. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  4. 牛客多校第四场 I string 后缀自动机/回文自动机

    这个回文自动机的板有问题,它虽然能过这道题,但是在计算size的时候会出锅! 题意: 求一个字符串中本质不同的连续子串有几个,但是某串和它反转后的字符串算一个. 题解: 要注意的是,一般字符串题中的“ ...

  5. HDU 4436 str2int(后缀自动机)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4436 [题目大意] 给出一些字符串,由0~9组成,求出所有不同子串的和. [题解] 将所有字符串添 ...

  6. HDU 4436 str2int (后缀自动机SAM,多串建立)

    str2int Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  7. 识别子串 (string)——后缀自动机+线段树

    题目 [题目描述] 一般地,对于一个字符串 S,和 S 中第 $ i $ 个字符 x,定义子串 $ T=S(i.j) $ 为一个关于 x 的识别子申,当且仅当: 1.$ i \leq x \leq j ...

  8. Codeforces 917F Substrings in a String - 后缀自动机 - 分块 - bitset - KMP

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个字母串,要求支持以下操作: 修改一个位置的字母 查询一段区间中,字符串$s$作为子串出现的次数 Solution 1 Bitset 每 ...

  9. cf1121F. Compress String(后缀自动机)

    题意 题目链接 Sol 居然出个SAM板子也是没谁了233 #include<bits/stdc++.h> #define Pair pair<int, int> #defin ...

  10. #1413 : Rikka with String 后缀自动机 + 二级差分

    http://hihocoder.com/problemset/problem/1413?sid=1199641 这题断断续续做了2个多星期吧,一直不会 设总答案为sum,替换后新加的子串数量为x,失 ...

随机推荐

  1. 编译python为可执行文件遇到的问题:使用python-oracledb连接oracle数据库时出现错误:DPY-3010

    错误原文: DPY-3010: connections to this database server version are not supported by python-oracledb in ...

  2. 使用Arduino制作摩尔斯电码收发器

    摩尔斯电码通过不同的排列顺序来表达不同的英文字母.数字和标点符号等.在今天,国际摩尔斯电码依然被使用着.比如,摩尔斯电码最广为人知的用法发送求救信号SOS,SOS信号的组合方式为:.再比如,假设我们通 ...

  3. UVA10054 The Necklace 题解

    好可恶一道题,怎么没人告诉我输出之间有空行( 思路是先抽象成图,然后跑一边dfs记录边的前后顺序. 对于不能成环的情况,只需要再开个数组记录度数判断奇点即可. 若存在奇点则break掉,剩下的跑dfs ...

  4. Node.js中常用的设计模式有哪些?

    本文由葡萄城技术团队首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 设计模式简介 设计模式是由经验丰富的程序员在日积月累中抽象出的用以解决通用问题的可 ...

  5. React项目中webpack的配置过程

    初始化一个web项目 使用npm init -y 初始化一个项目 在项目目录下创建src, dist文件夹,创建webpack.config.js配置文件 然后在src文件夹下创建index.js, ...

  6. CF1295D Same GCDs

    前置知识: 辗转相除法 欧拉函数 首先,根据辗转相除法求 \(\gcd\) 的公式,可得 \(\gcd(a+x,m)=\gcd((a+x)\mod m,m)\). 则题目可以转化为:求有多少 \(x\ ...

  7. 字符串小记 I:基本结构与简单匹配(更新中)

    0.一些定义 在开始之前,我们先给出一些关于字符串的定义: 记 \(|S|\) 表示字符串 \(S\) 的长度,\(S_i\) 表示该字符串中第 \(i\) 位的字符,\(S_{l,r}\) 表示该字 ...

  8. Isito 入门(九):安全认证

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 7,认证 Peer Authentication PeerAuthentication 的定义 实验 Reque ...

  9. 多维详述MediaBox互动直播AUI Kit低代码开发方案

    本专栏将分享阿里云视频云MediaBox系列技术文章,深度剖析音视频开发利器的技术架构.技术性能.开发能效和最佳实践,一起开启音视频的开发之旅.本文为MediaBox最佳实践篇,重点从互动直播AUI ...

  10. 浅析KV存储之长尾时延解决办法

    本文分享自华为云社区<浅析KV存储之长尾时延问题,华为云 GeminiDB Redis 探寻行业更优解决方案!>,作者:华为云数据库GaussDB NoSQL团队. 目前,KV存储的广泛使 ...