刷题总结——字符串(ssoj)
题目:
给定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)的更多相关文章
- LeetCode刷题总结-字符串篇
本文梳理对LeetCode上有关字符串习题的知识点,并给出对应的刷题建议.本文建议刷题的总数为32题.具体知识点如下图: 1.回文问题 题号:5. 最长回文子串,难度中等 题号:214. 最短回文串, ...
- leetcode刷题记录——字符串
242.有效地字母异位词 由于本题的字符串只包含 26 个小写字符,因此可以使用长度为 26 的整型数组对字符串出现的字符进行统计,并对比字母出现的次数是否一致.不再使用 HashMap. toCha ...
- leetcode刷题-43字符串相乘
题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 思路 字符串转数字:从字符串第一位开始取,每次取出的值转换为数字 ...
- LeetCode随缘刷题之字符串转换整数
package leetcode.day_01_29; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 请你 ...
- leetCode刷题(将字符串转成W形状的字符串再以Z形字符串输出)
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- 刷题总结——date(ssoj)
题目: 题目背景 SOURCE:NOIP2015-SHY-9 题目描述 小Y和小Z好不容易有机会相见啦,可是邪恶的小H却不想让他们相见.现在有一些城市,城市之间有双向路径相连,有路径相连的城市之间可以 ...
- LeetCode刷题指南(字符串)
作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...
- leecode刷题(16)-- 字符串转换整数
leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...
- <LC刷题二>回文字符串判断之leetcode125&234
其他刷题记录见博客首页 1,leecode125 验证回文串 原题: 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. ...
随机推荐
- codeforce Gym 100500A Poetry Challenge(博弈,暴搜)
题解:状态压缩之后,暴力dfs,如果有一个选择,能让对手必败,那么就是必胜态,能转移到的状态都是对手的必胜态,或者无法转移,就是必败态. 总算是过了,TLE是因为状态没判重. #include< ...
- Form组件的验证流程及扩展(钩子)
Form组件的验证流程及扩展(钩子) 常用的form class TestForm(Form): t1 = fields.CharField( widget=widgets.Textarea # 输入 ...
- C++中malloc / free 和 new / delete 的区别?
1.malloc/free 是C++/C语言的标准库函数,New/delete是C++运算符:都是用于申请动态内存和释放内存. 2.new做两件事:分配内存和调用类的构造函数,delete是:调用类的 ...
- 使用jquery.ajax实现省市的二级联动(SSH架构)
首先实现jquery ajax的二级联动 要下载个jquery.js 我在这里就不准备了 自行百度下载 背景介绍:通过部门的ID来查找部门下的所有班级 我实现二级联动的思路是:先查询所有部门 显示在页 ...
- noip考前注意事项
明天就要离开学校,后天的现在Day1已经考完啦,临近考试了紧不紧张呢(不紧张才怪),那么考前我们应该注意点什么呢? 1.带好自己的证件,带好自己的证件,带好自己的证件,这很重要. 2.试机的时候一定要 ...
- SQL防止重复提交和Filter
/class User package com.neuedu.bean; import java.io.Serializable; public class User implements Seria ...
- JAVA基础篇—文件与流
处理字节流的抽象类 InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等. OutputStream是字节输出流的所有类的超类,一般我们使用它的 ...
- Mr. Panda and Crystal HDU - 6007 最短路+完全背包
题目:题目链接 思路:不难看出,合成每个宝石需要消耗一定的魔力值,每个宝石有一定的收益,所以只要我们知道每个宝石合成的最小花费,该题就可以转化为一个背包容量为初始魔力值的完全背包问题,每个宝石的最小花 ...
- CodeForces 568B DP Symmetric and Transitive
题意: 根据离散数学的内容知道,一个二元关系是一个二元有序组<x, y>的集合. 然后有一些特殊的二元关系,比如等价关系,满足三个条件: 自反性,任意的x,都有二元关系<x, x&g ...
- 细嚼慢咽 Mongoose 5
此文已由作者黄锴授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 由于Mongoose一直没有中文文档,加上现在市面上充斥着太多"快速上手",很多中文 ...