http://acm.hdu.edu.cn/showproblem.php?pid=4641

http://acm.hdu.edu.cn/showproblem.php?pid=6194

题意: 开始时给出一个字符串,给出两种操作,一种是在字符串后面添加一个字符,
另一个是查询出现过最少出现K次的字串个数。

分析:

建立后缀自动机,添加一个字符插入即可,对于查询,前面计算过的没必要再算,
直接从当前开始往前面找,已经达到K次的就不管,说明前面已经计算过,现在达到
K次的加进答案。

#include<bits/stdc++.h>
using namespace std;
#define mem(a , b) memset(a , b , sizeof(a))
const int maxn = 250001;
#define ll long longstruct SAM{int trans[maxn<<1][26] , slink[maxn<<1] , maxlen[maxn<<1];int last , now , root;ll ans=0;int sum[maxn<<1];void newnode(int v){maxlen[++now]=v;mem(trans[now],0);}void extend(int c , int k){newnode(maxlen[last] + 1);int p = last , np = now;sum[now]=0;//  cout<<now<<endl;while(p && !trans[p][c]){trans[p][c] = np;p = slink[p];}if(!p) slink[np] = root;else{int q = trans[p][c];if(maxlen[p] + 1 != maxlen[q]){newnode(maxlen[p] +1 );int nq = now;memcpy(trans[nq] , trans[q] , sizeof(trans[q]));sum[nq]=sum[q];///分开的节点要继承slink[nq] = slink[q];slink[q] = slink[np] = nq;while(p && trans[p][c] == q){trans[p][c] = nq;p = slink[p];}}else{slink[np]=q;}}last = np;int w=np;while(w && sum[w] < k ){sum[w]++;if(sum[w]==k) ans+=maxlen[w]-maxlen[slink[w]];w=slink[w];}// cout<<np<<endl;
    }void init(){root = last = now = 1;slink[root]=0;mem(trans[root],0);sum[root]=0;ans=0;}}sam;
int main()
{int n,q,k;while(scanf("%d%d%d",&n,&q,&k)!=EOF){sam.init();char str[maxn];scanf("%s",str);for(int i=0 ; i<n ; i++){sam.extend(str[i]-'a'  , k);}while(q--){int T;scanf("%d",&T);getchar();if(T==1){ char op;op=getchar();sam.extend(op-'a' , k );// cout<<op<<endl;
        }else{printf("%lld\n",sam.ans);}}}}

View Code

关于恰好出现k次的字符串 , 我们只要求出至少k次的字串 - 至少(k+1)次的字串 ,不恰好就是k次吗

#include<bits/stdc++.h>
using namespace std;
#define mem(a , b) memset(a , b , sizeof(a))
const int maxn = 250001;
#define ll long longstruct SAM{int trans[maxn<<1][26] , slink[maxn<<1] , maxlen[maxn<<1];int last , now , root;ll ans=0;int sum[maxn<<1];void newnode(int v){maxlen[++now]=v;mem(trans[now],0);}void extend(int c , int k){newnode(maxlen[last] + 1);int p = last , np = now;sum[now]=0;//  cout<<now<<endl;while(p && !trans[p][c]){trans[p][c] = np;p = slink[p];}if(!p) slink[np] = root;else{int q = trans[p][c];if(maxlen[p] + 1 != maxlen[q]){newnode(maxlen[p] +1 );int nq = now;memcpy(trans[nq] , trans[q] , sizeof(trans[q]));sum[nq]=sum[q];///分开的节点要继承slink[nq] = slink[q];slink[q] = slink[np] = nq;while(p && trans[p][c] == q){trans[p][c] = nq;p = slink[p];}}else{slink[np]=q;}}last = np;int w=np;while(w && sum[w] < k ){sum[w]++;if(sum[w]==k) ans+=maxlen[w]-maxlen[slink[w]];w=slink[w];}// cout<<np<<endl;
    }void init(){root = last = now = 1;slink[root]=0;mem(trans[root],0);sum[root]=0;ans=0;}}sam;
int main()
{int n,q,k;int t;scanf("%d",&t);while(t--){string str;int k;cin>>k>>str;sam.init();n=str.size();for(int i=0 ; i<n ; i++){sam.extend(str[i]-'a'  , k);}ll sum1=sam.ans;sam.init();for(int i=0 ; i<n ; i++){sam.extend(str[i]-'a'  , k+1);}ll sum2=sam.ans;printf("%lld\n",sum1-sum2);}}

View Code

转载于:https://www.cnblogs.com/shuaihui520/p/10731186.html

HDU4641 || 6194多校 (后缀自动机-最少出现K次的字串个数 || 恰好出现K次字符串的个数)...相关推荐

  1. 后缀数组以及利用后缀数组求取最长公共字串

    后缀树组是一个字符串的所有后缀的排序数组.后缀是指从某个位置 i 开始到整个串末尾结束的一个子串.字符串 r 的从 第 i 个字符开始的后缀表示为 Suffix(i) ,也就是Suffix(i)=r[ ...

  2. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  3. 后缀自动机 ---- P3804 【模板】后缀自动机(求每个等价类最长串的出现次数)

    后缀自动机一些关键点 首先后缀自动机上面每个节点都是一个等价类并且是最长的字符串的结尾 后缀自动机上的fail链反建就是parent tree,下面是SAM和Parent tree的构造 对于这道模板 ...

  4. @总结 - 6@ 后缀自动机

    目录 @0 - 参考资料@ @0.5 - 引言@ @1 - what is it?@ @自动机@ @DAWG@ @终点集合 end-pos@ @后缀链接 与 parent 树@ @2 - how to ...

  5. 简(kun)单(nan)到让我开(jue)心(wang)的后缀自动机全家桶(普通后缀、广义后缀、子序列)...

    目录 参考文献 后缀自动机是什么神仙玩意? 例题 right集合.等价类以及Parent树 定义 等价类性质 Trie?DAG? 自动机?自动鸡? 自动机的基本性质 一定存在后缀自动机吗? 后缀自动机 ...

  6. HDU - 4641 K-string(后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s ,规定 K-string 为字符串 s 中出现次数大于等于 k 次的字串,现在有 m 次操作,每次操作有两种: 1 ch:在字符串 s 后面添加字符 ...

  7. 不在B中的A的子串数量 HDU - 4416 (后缀自动机模板题目)

    题目: 给定一个字符串a,又给定一系列b字符串,求字符串a的子串不在b中出现的个数. 题解: 先将所有的查询串放入后缀自动机(每次将sam.last=1)(算出所有子串个数) 然后将母串放入后缀自动机 ...

  8. 查找一段文字中最长的重复字串 – 编程珠玑(排过序的后缀数组的应用)

    转自:https://www.cse.msu.edu/~liyang5/?p=53 <编程珠玑>在第15章"珍珠字符串"一节,给出了一个非常漂亮的实现 – 基于目标字符 ...

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

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

  10. 牛客多校4 - Count New String(序列自动机+广义后缀自动机)

    题目链接:点击查看 题目大意: 题目分析:首先观察到集集合 A 中那个套娃的表示,外层的范围是 [ x1 , y1 ] ,内层是 [ x2 , y2 ] ,而内层的定义域实际上是包含在外层的定义域内的 ...

最新文章

  1. 港中大、商汤开源目标检测工具包mmdetection,对比Detectron如何?
  2. .NET Core on K8S学习实践系列文章索引(持续更新)
  3. MySQL总结(二)——入门
  4. 基于微服务架构、运行于容器中的.NET Core示例应用eShopOnContainers
  5. java继承数组实例_【Java】理解封装、继承、多态和对象数组的综合实例(简易的租车系统,附代码)...
  6. iOS9使用提示框的正确实现方式(UIAlertView is deprecated)
  7. matlab查找指定文件夹下文件(附汉字和标点符号读取方法)
  8. GPS测量原理与应用_第四版_徐绍铨_武汉大学出版社_考试复习资料
  9. word-插入数学公式(mathtype)
  10. 干货|关于云计算认证升级内容
  11. Ping命令出现 Packet filtered
  12. 9.9的阿里巴巴编码规范考试竟如此简单?搜集试题分享!让我们一起守护开发规范!
  13. 我在哪?从何处来,又到哪里去?
  14. mysql源码安装详解
  15. android 关机快捷键是什么,Android 关机问题快速定位
  16. 教师资格证报名网页兼容问题
  17. 如何在arxiv上发论文
  18. 云视听极光TV版闪退解决方案
  19. 使用ls / 命令卡死,或者df -h 查看卡死解决办法
  20. IE去除“是否停止运行此脚本?此页面上的脚本造成Internet Explore运行速度减慢”的提示信息

热门文章

  1. 网站安全之密码明文传输漏洞
  2. [渝粤教育] 西南科技大学 公共关系学 在线考试复习资料
  3. 【sklearn第十八讲】神经网络模型
  4. C++ 使用正则表达式拆分字符串
  5. 计算机网络基础系列(四)HTTP、七层模型及其内部对应协议
  6. 【实物】端到端自动驾驶搭建教程(三)附完整资料
  7. wiki——Isogeometric_analysis
  8. GitHub资源学习的网址(未完待续)
  9. 俞昆20155335《网络对抗》MSF基础应用
  10. Swift-理解值类型