HDU4641_K-string
若它的一个子串出现的次数不少于K次,那么这个子串就是一个K-string。
现给出原串,每次可以向该串后面添加一个字符或者询问当前有多少个不同的K-string。
在线添加查询,解法直指SAM。
其实给添加函数直接设置一个返回值直接更新ans就好了。
对于每个状态,多开一个值记录它的出现次数,每次添加点过后,沿着last点的pre指正一边走一边判断就好了。
注意,每个点不要重复计算,如果一个点计算前就已经被标记计算了,那么pre上的其他的点也不需要计算了,显然。
召唤代码君:
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1000500
using namespace std; int next[maxn][26],pre[maxn],step[maxn],g[maxn];
int N,last,n,m,k;
long long ans;
int p,q,np,nq;
char s[maxn];
bool vis[maxn]; int add()
{
N++;
pre[N]=step[N]=g[N]=0;
vis[N]=false;
for (int i=0; i<26; i++) next[N][i]=0;
return N;
} void insert(int x)
{
p=last;np=add();step[np]=step[last]+1;last=np;
while (p!=-1 && next[p][x]==0) next[p][x]=np,p=pre[p];
if (p==-1) return;
q=next[p][x];
if (step[q]==step[p]+1) { pre[np]=q; return; }
nq=add();step[nq]=step[p]+1;pre[nq]=pre[q];g[nq]=g[q];vis[nq]=vis[q];
for (int i=0; i<26; i++) next[nq][i]=next[q][i];
pre[np]=pre[q]=nq;
while (p!=-1 && next[p][x]==q) next[p][x]=nq,p=pre[p];
} void count()
{
for (p=last; p!=0 && !vis[p]; p=pre[p])
{
g[p]++;
if (g[p]>=k)
{
ans+=step[p]-step[pre[p]];
vis[p]=true;
}
}
} int main()
{
while (scanf("%d%d%d",&n,&m,&k)!=EOF)
{
N=-1;N=add();pre[0]=-1;last=0;ans=0;
scanf("%s",s);
for (int i=0; s[i]; i++) insert(s[i]-'a'),count();
while (m--)
{
scanf("%d",&n);
if (n==2) printf("%I64d\n",ans);
else { scanf("%s",s); insert(s[0]-'a'); count(); }
}
}
return 0;
}
HDU4641_K-string的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- BCL中String.Join的实现
在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...
随机推荐
- $(document).ready(function() 与window.onload
$(document).ready(function() window.onload 事件是页面完全加载完的时候执行$(function(){ }) 是等页面上的标签加载完了就执行 页面加载完成后开始 ...
- js问题 window.location.hash和window.location.href有什么不同
hash:设置或获取 href 属性中在井号“#”后面的分段. href:设置或获取整个 URL 为字符串. 通过下面的测试你会发现区别,将代码放到你的HTML中,然后用浏览器打开,测试步骤: 点击“ ...
- AWK高端功能-数组
第1章 awk命令基础 1.1 awk命令执行过程 1.如果BEGIN 区块存在,awk执行它指定的动作. 2.awk从输入文件中读取一行,称为一条输入记录.如果输入文件省略,将从标准输入读取 3.a ...
- linux 问题收集
1,错误信息:bunzip2: command not found 解决方法:yum install -y bzip2 2,The X11 forwarding request was rejecte ...
- java多线程系列(一)---多线程技能
java多线程技能 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- postMan测试Controller接口
1.介绍 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件. 2.安装 Postman 4.1.2 下载地址: http://files.cnblogs.com/file ...
- HTTP 请求/响应报文结构
请求报文和响应报文都是由以下4部分组成: 1.请求行/响应行 2.请求头/响应头 3.空行 4.消息主体(请求体/响应体) 请求报文结构 请求行 格式为:Method Request-URI HTTP ...
- shell 本地接口自动化
一.基于http/https的接口 一般情况下,当前大多公司在做接口自动化的时候都会使用一些工具:比如:postman/jmeter/python自研开发接口平台... 以上的情况,都是在源码与测试使 ...
- tomcat 在liunx中shutdown后进程仍然存在的两种实用解决办法
方法一: 查找tomcat进程并kill ps -elf | grep ${ctompath} | grep -v grep | awk '{print $4}' | xargs kill -9 此处 ...
- 一个很NB的404页面
一个带彩蛋的 404 页面 不得不说这个程序猿很有才 前往404页面 触发方法 按住鼠标左键 在页面中心不停的画圈 就可以进入神奇的地方了