原题链接

题意

  • 每个测试点,一开始给我们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. 一次考试的T3

    啊这感觉不太可做观察性质,发现这个字符串只由ABC构成这个性质必须利用仅仅由3种字符组成意味着什么呢?这个字符串只有种可能性这个有什么用呢?只是说明暴力枚举的时间复杂度会小一些而已.不止是这些. 首先 ...

  2. 维修道路(repair)

    维修道路(repair) 时间限制: 1 Sec  内存限制: 128 MB 题目描述 由于在十多年前道路改建时的突出贡献, Bob 被任命为维修道路的承包商, 他可以任意 选择两条路径去修理. Bo ...

  3. STL 迭代器

    工作之余看了一下<<accelerated c++>>这本书,挺有意思没,没有一大堆概念,直接就开始一步一步编写代码. 书中时不时会涉及到一些stl的概念,比如容器,算法,迭代 ...

  4. [Python]对称日!

    def check(year): if (year%4 == 0 and year%100 != 0) or year%400 == 0: return True else: return False ...

  5. linux系统centos7安装docker

    1.Docker官网安装地址 https://docs.docker.com/engine/install/centos/#prerequisites 2.离线安装下载地址 https://downl ...

  6. GitHub Actions 入门指南

    前言 GitHub Actions 可以构建一组自动化的工作流程,并提供了拉取请求.合并分支等事件来触发他们.一般成熟的开源项目会在每个版本发布时提供 releases ,它就是通过 Actions ...

  7. Webpack相关知识点

    webpack的优点 webpack从配置的入口出发,可以打包所有前端资源,同时可以配置多种loader来处理不同类型文件的转换,并且可以配置plugin来扩展模块打包流程,满足更多构建中特殊的需求, ...

  8. 【uniapp】【外包杯】学习笔记day06 | 微信小程序导航栏的制作并推送的到码云【黑】

    先创建分支 格式化快捷键 shift+alt+f

  9. BI到底是什么,是否所有企业都适合上BI?

    商业智能(Business Intelligence)的概念 商业智能(BI)是一种综合性的数据分析和决策支持系统,旨在帮助企业从海量的数据中提取有价值的信息,并将其转化为洞察力.报告和可视化呈现,以 ...

  10. 企业数据分析免费试用的BI工具,有什么推荐?

    当涉及到企业数据分析的免费试用BI工具时,有几个受欢迎且功能强大的选项可供选择.以下是对每个工具的详细介绍,帮助您了解其特点和优势. Datainside BI(https://datainside. ...