HDU 4641 K string 后缀自动机
题意
每个测试点,一开始给我们n,m,k然后是一个长度为n的字符串。
之后m次操作,1 c是往字符串后面添加一个字符c,2是查询字符串中出现k次以及以上的子串个数,m为2e5
思路
首先可以看出这是在线算法(离线其实也可以),然后是查询出现至少k次的子串,这样我们可以直接联系到后缀自动机,与我们本题的需求较为契合
我们知道后缀自动机中,每个节点代表的不同子串数量为
\]
- 而每个节点的出现次数是其本身与link树的所有子树的标记次数之和,所以每次插入一个字符之后,我们都沿着link向上更新,对沿路节点的标记+1,如果出现了加完后标记正好为k的节点,则
\]
然后如果某个节点在访问之前就达到了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 后缀自动机的更多相关文章
- HDU 4622 Reincarnation(后缀自动机)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4622 [题目大意] 给出一个长度不超过2000的字符串,有不超过10000个询问,问[L,R]子串 ...
- HDU 4436 str2int(后缀自动机)(2012 Asia Tianjin Regional Contest)
Problem Description In this problem, you are given several strings that contain only digits from '0' ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 牛客多校第四场 I string 后缀自动机/回文自动机
这个回文自动机的板有问题,它虽然能过这道题,但是在计算size的时候会出锅! 题意: 求一个字符串中本质不同的连续子串有几个,但是某串和它反转后的字符串算一个. 题解: 要注意的是,一般字符串题中的“ ...
- HDU 4436 str2int(后缀自动机)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4436 [题目大意] 给出一些字符串,由0~9组成,求出所有不同子串的和. [题解] 将所有字符串添 ...
- HDU 4436 str2int (后缀自动机SAM,多串建立)
str2int Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- 识别子串 (string)——后缀自动机+线段树
题目 [题目描述] 一般地,对于一个字符串 S,和 S 中第 $ i $ 个字符 x,定义子串 $ T=S(i.j) $ 为一个关于 x 的识别子申,当且仅当: 1.$ i \leq x \leq j ...
- Codeforces 917F Substrings in a String - 后缀自动机 - 分块 - bitset - KMP
题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个字母串,要求支持以下操作: 修改一个位置的字母 查询一段区间中,字符串$s$作为子串出现的次数 Solution 1 Bitset 每 ...
- cf1121F. Compress String(后缀自动机)
题意 题目链接 Sol 居然出个SAM板子也是没谁了233 #include<bits/stdc++.h> #define Pair pair<int, int> #defin ...
- #1413 : Rikka with String 后缀自动机 + 二级差分
http://hihocoder.com/problemset/problem/1413?sid=1199641 这题断断续续做了2个多星期吧,一直不会 设总答案为sum,替换后新加的子串数量为x,失 ...
随机推荐
- 算法2:寻找吸血鬼数(JS)
任务二:寻找吸血鬼数 打印所有4位吸血鬼数和它们的獠牙 提示:一共有7个: 吸血鬼数: -该鬼的位数为偶数: -该数的所有位中.是0的位少一半: -该数每一位上的数字重新组合为两个位数相等的数,乘 ...
- 重写equals方法的注意事项
重写equals方法的注意事项 一. 在重写equals方法时,要注意满足离散数学上的特性1 自反性:对任意引用值X,x.equals(x)的返回值一定为true.2 对称性:对于任何引用 ...
- android 中ids.xml资源的使用
ids.xml 前面我们见识过ids.xml文件,但是这个文件是什么意思呢?我们来看下文档中的介绍: 先看下它给的例子: XML file saved at res/values/ids.xml: 使 ...
- PythonNotes_Basic1
基本数据类型 标准数据类型 常见数据类型: Number(数字) String(字符串) bool(布尔类型) List(列表) Tuple(元组) Set(集合) Dictionary(字典) 六个 ...
- JVM SandBox 的技术原理与应用分析
https://www.infoq.cn/article/tsy4lgjvsfweuxebw*gp https://blog.csdn.net/qq_40378034/article/details/ ...
- Redis Functions 介绍之一
Redis提供了编程接口(programming interface)可以让你在Redis服务器端执行客户的脚本. 一个重大的变化就是从Redis 7开始,你可以选择使用Redis Functions ...
- ORACLE SQL语句逻辑读高优化案例
川川找我优化SQL,逻辑读达到398,000,安排一下. SQL和执行计划: SELECT t1.*, t3.bed_number, t3.patient_name, t4.name FROM odw ...
- 万字解析XML配置映射为BeanDefinition的源码
本文分享自华为云社区<Spring高手之路16--解析XML配置映射为BeanDefinition的源码>,作者:砖业洋__. 1. BeanDefinition阶段的分析 Spring框 ...
- C.C++作用域和static用法
C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为 6 种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域. 从作用域看: 全局变量具有全局作用域.全 ...
- 文心一言 VS 讯飞星火 VS chatgpt (138)-- 算法导论11.4 2题
二.用go语言,试写出HASH-DELETE 的伪代码;修改 HASH-INSERT,使之能处理特殊值DELETED. 文心一言: 首先,让我们定义一个基本的哈希表数据结构.这个结构将包括一个存储键值 ...