题目:

给定n个小的字符串T和一个大的字符串S,先输出T总共再S中出现了多少次

然后q个询问···每次修改S上的一个字母,然后再次输出上述答案···

n小于1000,q<200000,T的总长度和S的长度都小于100000;

题解:

我们可以发现,每次修改位置P,那么S影响的范围只有在P-MAX到P+MAX的范围,其中MAX为T的最长长度····所以将这一范围的S跑一边AC自动机··然后更新答案即可··

这道题也让我发现我做AC自动机以来一直有的一个不好的习惯··每次求出现次数都是暴力跳fail指针,这样再这道题里直接T····

其实再我们bfs构建fail指针时,设u的指针为v,我们可以直接tree[u].cnt+=tree[v].cnt,这样每次加的时候直接加上一个节点cnt就可以了··不用暴力跳fail···代码:

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
queue<int>que;
const int N=;
struct node
{
int son[],cnt,fail;
void clear()
{
memset(son,,sizeof(son));
cnt=fail=;
}
}tree[N];
int n,m,T,tot,maxx=;
char s[N],t[];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
int buf[];
inline void W(int x){
if(!x){putchar('');return ;}
if(x<){putchar('-');x=-x;}
while(x) buf[++buf[]]=x%,x/=;
while(buf[]) putchar(buf[buf[]--]+);
return ;
} inline void build()
{
int po=;
int len=strlen(s);maxx=max(maxx,len);
for(int i=;i<len;i++)
{
if(!tree[po].son[s[i]-'a'])
tree[tree[po].son[s[i]-'a']=++tot].clear();
po=tree[po].son[s[i]-'a'];
}
tree[po].cnt++;
}
inline void buildfail()
{
que.push();
while(!que.empty())
{
int u=que.front();que.pop();
for(int i=;i<;i++)
{
int v=tree[u].fail;
while(!tree[v].son[i]) v=tree[v].fail;
v=tree[v].son[i];int w=tree[u].son[i];
if(w) tree[w].fail=v,que.push(w),tree[w].cnt+=tree[v].cnt;
else tree[u].son[i]=v;
}
}
}
int main()
{
//freopen("string.in","r",stdin);
//freopen("string.out","w",stdout);
n=R(),m=R();
for(int i=;i<;i++)
tree[].son[i]=;
tree[tot=].clear();
for(int i=;i<=n;i++)
{
scanf("%s",s);
build();
}
buildfail();
scanf("%s",s);
int len=strlen(s),a;
int now=,ans=;
for(int i=;i<len;i++)
{
now=tree[now].son[s[i]-'a'];
ans+=tree[now].cnt;
}
W(ans),putchar('\n');
while(m--)
{
a=R();scanf("%s",t);
int now=,ans1=,ans2=;
for(int i=max(,a-maxx);i<=min(a+maxx-,len-);i++)
{
now=tree[now].son[s[i]-'a'];
ans1+=tree[now].cnt;
}
ans-=ans1;
s[a-]=t[];now=;
for(int i=max(,a-maxx);i<=min(a+maxx-,len-);i++)
{
now=tree[now].son[s[i]-'a'];
ans2+=tree[now].cnt;
}
ans+=ans2;
W(ans),putchar('\n');
}
return ;
}

刷题总结——字符串(ssoj)的更多相关文章

  1. LeetCode刷题总结-字符串篇

    本文梳理对LeetCode上有关字符串习题的知识点,并给出对应的刷题建议.本文建议刷题的总数为32题.具体知识点如下图: 1.回文问题 题号:5. 最长回文子串,难度中等 题号:214. 最短回文串, ...

  2. leetcode刷题记录——字符串

    242.有效地字母异位词 由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,并对比字母出现的次数是否一致.不再使用 HashMap. toCha ...

  3. leetcode刷题-43字符串相乘

    题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 思路 字符串转数字:从字符串第一位开始取,每次取出的值转换为数字 ...

  4. LeetCode随缘刷题之字符串转换整数

    package leetcode.day_01_29; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 请你 ...

  5. leetCode刷题(将字符串转成W形状的字符串再以Z形字符串输出)

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  6. 刷题总结——date(ssoj)

    题目: 题目背景 SOURCE:NOIP2015-SHY-9 题目描述 小Y和小Z好不容易有机会相见啦,可是邪恶的小H却不想让他们相见.现在有一些城市,城市之间有双向路径相连,有路径相连的城市之间可以 ...

  7. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

  8. leecode刷题(16)-- 字符串转换整数

    leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...

  9. <LC刷题二>回文字符串判断之leetcode125&234

    其他刷题记录见博客首页 1,leecode125 验证回文串 原题: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. ...

随机推荐

  1. [学习笔记] Markdown语法备忘

    Markdown语法总结 标题 # 这是一级标题 ## 这是二级标题 ### 这是三级标题 #### 这是四级标题 ##### 这是五级标题 ###### 这是六级标题 注意#后面要加空格 字体 ** ...

  2. 设置DataGridView单元格的文本对齐方式

    实现效果: 知识运用: DataGridViewCellStyle类的Alignment属性     //获取或设置DataGridView单元格内的单元格内容的位置 public DataGridV ...

  3. python基础一 day15 作业

    3.处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕def check_file(filename,aim): with open(filename,encoding= ...

  4. Dojo的on函数(以前的dojo.connect)

    ​同jQuery的on函数: require(["esri/map", "dojo/on"], function(Map, on) { // ... on(my ...

  5. JQuery EasyUI学习记录(一)

    1.主页设计(JQuery EasyUI插件) 下载easyUI开发包: 将easyUI资源文件导入页面中: <link rel="stylesheet" type=&quo ...

  6. Linux curl命令中,HTTP 302处理

    在Linux中使用curl命令时,偶尔会遇到一些URL跳转到新的URL,即HTTP中的3XX(redirection,重定向 ). $curl -s -I $URL > log 这时在返回的报文 ...

  7. destoon公司账户增加销售区域等下拉列表配置

    开始接触dt时不了解,其实直接用自定义字段即可.不过既然改过了,就记录一下. 在后台系统设置,模块管理,点击会员模块最后的设置图表 打开会员模块设置 如图 增加 主要销售区域 并在公司修改页面调用 1 ...

  8. 数字内置方法详解(int/long/float/complex)

    一.常用方法 1.1.int 以下是Python2.7的int内置函数: 序号 函数名 作用 举例 1 int.bit_length() 二进制存储这个整数至少需要多少bit(位). >> ...

  9. 《零基础入门学习Python》【第一版】视频课后答案第001讲

    测试题答案: 0. Python 是什么类型的语言? Python是脚本语言 脚本语言(Scripting language)是电脑编程语言,因此也能让开发者藉以编写出让电脑听命行事的程序.以简单的方 ...

  10. Running OOM killer script for process 32248 for Solr on port 8983

    Running OOM killer script for process 32248 for Solr on port 8983 分析1 https://blog.csdn.net/qq_41665 ...