题目链接:点击查看

题目大意:给出一个字符串 s ,规定 K-string 为字符串 s 中出现次数大于等于 k 次的字串,现在有 m 次操作,每次操作有两种:

  1. 1 ch:在字符串 s 后面添加字符 ch
  2. 2:询问当前的字符串中有多少个子串为 K-string

题目分析:因为后缀自动机是在线构造的,所以操作一我们可以直接用后缀自动机来完成,而操作二我们可以直接在后缀链接上不断向上维护即可,因为数据比较水,所以这样暴力的更新是可以过的,不过需要注意的是还是要求了对后缀自动机的理解以及对代码的改写能力有一定要求,还是得加深对SAM的理解啊

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=3e5+100;char s[N];int tot,last,n,k,m,cnt[N<<1];LL ans;struct Node
{int ch[26];int fa,len;
}st[N<<1];void newnode()
{tot++;for(int i=0;i<26;i++)st[tot].ch[i]=0;st[tot].fa=st[tot].len=0;cnt[tot]=0;
}void add(int x)
{newnode();int p=last,np=last=tot;st[np].len=st[p].len+1;while(p&&!st[p].ch[x])st[p].ch[x]=np,p=st[p].fa;if(!p)st[np].fa=1;else{int q=st[p].ch[x];if(st[p].len+1==st[q].len)st[np].fa=q;else{int nq=++tot;st[nq]=st[q]; st[nq].len=st[p].len+1;cnt[nq]=cnt[q];st[q].fa=st[np].fa=nq;while(p&&st[p].ch[x]==q)st[p].ch[x]=nq,p=st[p].fa;//向上把所有q都替换成nq}}int pos=last;while(pos&&cnt[pos]<k){cnt[pos]++;if(cnt[pos]>=k)ans+=st[pos].len-st[st[pos].fa].len;pos=st[pos].fa;}
}void init()
{ans=tot=0,last=1;newnode();scanf("%s",s);for(int i=0;i<n;i++)add(s[i]-'a');
}int main()
{
//#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
//#endif
//  ios::sync_with_stdio(false);while(scanf("%d%d%d",&n,&m,&k)!=EOF){init();while(m--){int op;scanf("%d",&op);if(op==1){scanf("%s",s);add(s[0]-'a');}elseprintf("%lld\n",ans);}}return 0;
}

HDU - 4641 K-string(后缀自动机)相关推荐

  1. hdu 6194string string string 后缀自动机

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 查询原串中出现次数等于k次的子串数量.需要用到基数排序. 构造完后缀自动机之后将节点按照maxl ...

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

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

  3. 2019牛客暑期多校训练营(第四场)I - String (后缀自动机+回文树)

    题目链接 题意 给一个字符串,求字符串子串的最大集合,集合中字符串互不相等,相等的定义为:a≠ba =\not ba≠​b 而且 a≠rev(b)a =\not rev(b)a≠​rev(b) ...

  4. HDU - 5008 Boring String Problem(后缀树求本质不同第k大子串)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串,再给出 mmm 次询问,每次询问需要输出本质不同第 kkk 小的子串的起止位置.如果有多个答案,输出起点最小的那个.强制在线. 题目分析 ...

  5. HDU 6194 string string string :后缀数组+单调队列 | 后缀自动机

    题意:给出一个字符串,求出出现了恰好k次的子串的个数. 题解:恰好k次 = 至少k次 - 至少k+1次.答案转化为求至少出现k次的子串个数统计.构造好后缀数组以及很重要的Height数组之后.用一个k ...

  6. HDU多校4 - 6988 Display Substring(后缀自动机+二分)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss,每个字母都有一个权值,现在要求所有本质不同子串中权值和第 kkk 大的权值 题目分析:如果没有本质不同,那有一个很简单的二分套二 ...

  7. hdu 5008 Boring String Problem(后缀数组+rmq)

    题目链接:hdu 5008 Boring String Problem 题意: 给你一个字符串,有q个询问,每次询问该字符串所有的子串中字典序第k小的是哪个串,输出位置,如果有多个位置,输出最靠左的那 ...

  8. HDU 6194 后缀自动机

    后缀自动机求K次出现的子串的个数: #include <iostream> #include<cstdio> #include<algorithm> #includ ...

  9. HDU 4416 (后缀自动机)

    HDU 4416 Good Article Good sentence Problem : 给一个串S,和一些串T,询问S中有多少个子串没有在T中出现. Solution :首先对所有的T串建立后缀自 ...

最新文章

  1. 微信小程序获取验证码倒计时
  2. “反机器学习”:人工智能突破的关键是“遗忘”
  3. CISCO路由器、交换机密码破解
  4. banner手动切换效果
  5. java从Object类型转换成double类型
  6. MySQL-MongoDB开源监控利器之PMM
  7. KMPLAYER无法播放rmvb格式的解决办法
  8. HDU多校1 - 6959 zoto(莫队+树状数组/值域分块)
  9. 苏州科技学院计算机组成原理考试,苏州科技学院计算机组成原理复习提纲.doc...
  10. 走近算法:受众行为分析与人群定向
  11. 官网下载mysql源码
  12. Android 最常用的设计模式六 安卓源码分析—责任链模式
  13. this()在java中什么意思?
  14. 字体:等宽字体与比例字体 - Monospaced font Proportional font
  15. linux安装阵列卡驱动程序,linux 安装阵列卡驱动
  16. HTML超链接基本属性
  17. 【前端冷知识】冷门函数之Math.hypot
  18. 【JavaScript算法】---希尔排序(转载自我的老师 Alley-巷子)
  19. linux定时清理临时目录,tmp临时文件目录自动清理
  20. vue.js 拖拽排序_快速轻巧的Vue.js拖放可排序库

热门文章

  1. springboot基本属性注入
  2. Nacos支持配置的动态更新
  3. Nginx负载均衡策略之least_conn
  4. Nginx的events块指令的配置使用
  5. 偏向锁的获取和撤销逻辑
  6. 手写自己的MyBatis框架-SqlSession
  7. 搭建基础架构-Order
  8. 缓存-SpringCache-自定义缓存配置
  9. MyBatis增删改对二级缓存的影响
  10. 格式化输出字符串变量