原题链接

题意

  • 每个测试点,一开始给我们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. 研发三维GIS系统笔记/实现wgs84投影-002

    四叉树代码修改完善 原来的代码中,没有使用投影转换,直接使用的是世界坐标(单位是米), CELLQuadTree::CELLQuadTree( CELLTerrainInterface* pInter ...

  2. 【matplotlib 实战】--堆叠柱状图

    堆叠柱状图,是一种用来分解整体.比较各部分的图.与柱状图类似,堆叠柱状图常被用于比较不同类别的数值.而且,它的每一类数值内部,又被划分为多个子类别,这些子类别一般用不同的颜色来指代. 柱状图帮助我们观 ...

  3. 轻松掌握组件启动之MongoDB(番外篇):高可用复制集架构环境搭建-mtools

    引言 在前两章节中,我们详细讲解了如何手动配置启动MongoDB.然而,现在有许多不同的工具可以帮助我们更方便地启动和创建MongoDB数据库.因此,今天我将介绍一个名为mtools的开源项目,它可以 ...

  4. CMD和AMD理解

    #AMD <br>1.AMD就是Asynchronous Module Definition,中文名是异步模块定义的意思.<br>2.AMD解决两个问题:解决依赖.异步加载&l ...

  5. JS逆向实战25——某壳找房模拟登录+百度喵星人指纹加密破解.

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标 目标网站 aHR0c ...

  6. 一个基于Vue模型的表单生成器

    哈喽,我是老鱼,一名致力于在技术道路上的终身学习者.实践者.分享者! Vuetify Form Base是一个基于模型的表单生成器,目的是提供一个工具,以便以较少的努力从任何模型数据生成可编辑的表单, ...

  7. websocket和ajax的区别(和http的区别)

    websocket和ajax的区别(和http的区别) https://segmentfault.com/a/1190000021741131 1. 本质不同 ajax,即异步JavaScript和X ...

  8. NEFU OJ Problem1356 帽儿山奇怪的棋盘 题解

    帽儿山奇怪的棋盘 题目: Time Limit:1000ms | Memory Limit:65535K Description 军哥来到了帽儿山,发现有两位神人在顶上对弈.棋盘长成下图的模样: 每个 ...

  9. IDEA配置maven引入包时报Unable to import maven project: See logs for details 错误的解决办法

    这也是我遇到的问题,在此记录下一,当时百度了一下午试过了各种方法,最后看到了一位大佬的博客解决了这个问题. 所以我也抄一下大佬博客也是记录一下问题的解决过程,以免下次遇到相似问题再浪费不必要的时间 参 ...

  10. Soc的Bring Up流程

    1.Bring Up流程 SOC (System on a Chip) bring-up是一个复杂的过程,涉及到硬件.固件和软件的集成和验证,以下是一个基于BROM,SPL,UBOOT和Linux的启 ...