若它的一个子串出现的次数不少于K次,那么这个子串就是一个K-string。

现给出原串,每次可以向该串后面添加一个字符或者询问当前有多少个不同的K-string。

在线添加查询,解法直指SAM。

其实给添加函数直接设置一个返回值直接更新ans就好了。

对于每个状态,多开一个值记录它的出现次数,每次添加点过后,沿着last点的pre指正一边走一边判断就好了。

注意,每个点不要重复计算,如果一个点计算前就已经被标记计算了,那么pre上的其他的点也不需要计算了,显然。

召唤代码君:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #define maxn 1000500
  5. using namespace std;
  6.  
  7. int next[maxn][26],pre[maxn],step[maxn],g[maxn];
  8. int N,last,n,m,k;
  9. long long ans;
  10. int p,q,np,nq;
  11. char s[maxn];
  12. bool vis[maxn];
  13.  
  14. int add()
  15. {
  16. N++;
  17. pre[N]=step[N]=g[N]=0;
  18. vis[N]=false;
  19. for (int i=0; i<26; i++) next[N][i]=0;
  20. return N;
  21. }
  22.  
  23. void insert(int x)
  24. {
  25. p=last;np=add();step[np]=step[last]+1;last=np;
  26. while (p!=-1 && next[p][x]==0) next[p][x]=np,p=pre[p];
  27. if (p==-1) return;
  28. q=next[p][x];
  29. if (step[q]==step[p]+1) { pre[np]=q; return; }
  30. nq=add();step[nq]=step[p]+1;pre[nq]=pre[q];g[nq]=g[q];vis[nq]=vis[q];
  31. for (int i=0; i<26; i++) next[nq][i]=next[q][i];
  32. pre[np]=pre[q]=nq;
  33. while (p!=-1 && next[p][x]==q) next[p][x]=nq,p=pre[p];
  34. }
  35.  
  36. void count()
  37. {
  38. for (p=last; p!=0 && !vis[p]; p=pre[p])
  39. {
  40. g[p]++;
  41. if (g[p]>=k)
  42. {
  43. ans+=step[p]-step[pre[p]];
  44. vis[p]=true;
  45. }
  46. }
  47. }
  48.  
  49. int main()
  50. {
  51. while (scanf("%d%d%d",&n,&m,&k)!=EOF)
  52. {
  53. N=-1;N=add();pre[0]=-1;last=0;ans=0;
  54. scanf("%s",s);
  55. for (int i=0; s[i]; i++) insert(s[i]-'a'),count();
  56. while (m--)
  57. {
  58. scanf("%d",&n);
  59. if (n==2) printf("%I64d\n",ans);
  60. else { scanf("%s",s); insert(s[0]-'a'); count(); }
  61. }
  62. }
  63. return 0;
  64. }

  

HDU4641_K-string的更多相关文章

  1. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  2. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  3. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  4. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  5. js报错: Uncaught RangeError: Invalid string length

    在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...

  6. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  7. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  8. JavaScript中String对象的方法介绍

    1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...

  9. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  10. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

随机推荐

  1. python 实现字符串的切片功能

    '''string切片''' def string_split(stringone,split): m = [] if type(split)!=str: return False if split ...

  2. allure2 report+ jenkins 使用

    物色了一个挺漂亮的报告生成插件 ——allure. 下面介绍一下这个报告的使用. 1. 添加依赖 <dependencies> <!-- https://mvnrepository. ...

  3. 【转】Linux系统下的ssh使用

    Linux系统下的ssh使用(依据个人经验总结)   对于linux运维工作者而言,使用ssh远程远程服务器是再熟悉不过的了!对于ssh的一些严格设置也关系到服务器的安全维护,今天在此,就本人工作中使 ...

  4. Laya1.x Timer小记

    Timer是时钟管理类,在Laya初始化的时候会创建一个实例,通过Laya.timer访问. TimerHandler TimerHandler是对每一个定时任务的封装,每次调用frameOnce.f ...

  5. LeetCode 192. Word Frequency

    分析 写bash,不太会啊…… 难度 中 来源 https://leetcode.com/problems/word-frequency/ 题目 Write a bash script to calc ...

  6. Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介.Java REST Client.Java Client.Spri ...

  7. python 网页转pdf

    主要使用的是wkhtmltopdf的Python封装——pdfkit centos环境 安装:Install python-pdfkit pip install pdfkit 安装:Install w ...

  8. Netty源码分析第7章(编码器和写数据)---->第2节: MessageToByteEncoder

    Netty源码分析第七章: Netty源码分析 第二节: MessageToByteEncoder 同解码器一样, 编码器中也有一个抽象类叫MessageToByteEncoder, 其中定义了编码器 ...

  9. SQL IF while 游标

    -- if语句使用示例 declare @a int set @a=1 begin print @a =@a+1 end else begin print 'noooo' end -- while语句 ...

  10. shell--read命令

    read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...