KMP的正确使用法_x新疆网络赛Query on a string
题意,给定一个大字符串,给定一个小模式串,定义 两种不同的任务模式,分别是查询和更改:
查询对应区间内,有多少个匹配到位的数字;
修改某一位的某一个字母。
于是直觉告诉我们是KMP,而且需要一个单点更新,动态查询的数据结构——直觉上认为树状数组比较合适执行这个任务。
于是,开个大大数组,保存每次匹配时对应位的四字母的匹配指针的位置。
每次扫描到了模式串长度都往树状数组里面存入相关元素。
每次修改之后应当从新就地走一遍模式串,更新相关内容,注意,每次匹配到的新的结果和老结果向同的时候就应当退出。
#include<bits/stdc++.h>
using namespace std; const long long MAXN=;
char str[MAXN];
char str2[];
int lenOfSub;
int flags[MAXN];
int f[MAXN]; int n,m; int tree[MAXN];
void insert(int pos,int key)
{
pos+=;
while(pos<MAXN)
{
tree[pos]+=key;
pos+=pos&(-pos);
}
}
int getSum(int pos)
{
pos+=;
int ret=;
while(pos)
{
ret+=tree[pos];
pos-=pos&(-pos);
}return ret;
} void get_fail()
{
int len=strlen(str2);
lenOfSub=len;
f[]=f[]=;
for(int i=;i<len;++i)
{
int j=f[i];
while(j&&str2[i]!=str2[j])j=f[j];
f[i+]= str2[i]==str2[j]? j+:;
}
}
void get_match()
{
int j=f[];
int len=strlen(str);
for(int i=;i<len;++i)
{
while(j&&str[i]!=str2[j])j=f[j];
j= str[i]==str2[j]? j+:;
flags[i]=j;
}
// for(int i=0;i<len;++i)cout<<flags[i]<<ends;
// cout<<endl;
} void init()
{
scanf("%d\n",&n);
memset(tree,,sizeof(tree));
memset(f,,sizeof(f));
gets(str);
gets(str2);
get_fail();
get_match();
int len=strlen(str);
for(int i=;i<len;++i)
{
if(flags[i]==lenOfSub)insert(i,);
}
for(int it=;it<n;++it)
{
char cm[];
scanf("%s",cm); if(cm[]=='Q')
{
int pos1;int pos2;
scanf("%d%d",&pos1,&pos2);pos1--;pos2--;
int poss=-;int j=f[];
int ans=;
for(int i=pos1;i<=pos2;++i)
{
while(j&&str[i]!=str2[j])j=f[j];
j= str[i]==str2[j]? j+:;
if(j==lenOfSub)ans++;
if(j==flags[i])
{
poss=i;
break;
}
}
if(poss==-)
{
cout<<ans<<"\n";
}else
{
cout<<ans+(getSum(pos2)-getSum(poss))<<"\n";
} }else
{
int pp;
scanf("%d%s",&pp,cm);
pp--;
str[pp]=cm[];
int j=;
if(pp)j=flags[pp-];
for(int i=pp;i<len;++i)
{
while(j&&str[i]!=str2[j])j=f[j];
j= str[i]==str2[j]? j+:;
if(flags[i]==j)break;
if(flags[i]==lenOfSub)insert(i,-);
if(j==lenOfSub)insert(i,);
flags[i]=j;
}
}
} cout<<"\n";
} int main()
{
cin.sync_with_stdio(false); int t;
scanf("%d",&t) ;
while(t--)init(); return ; }
KMP的正确使用法_x新疆网络赛Query on a string的更多相关文章
- POJ3320 尺取法的正确使用法
一.前言及题意: 最近一直在找题训练,想要更加系统的补补思维,补补漏洞什么的,以避免被个类似于脑筋急转弯的题目干倒,于是在四处找书,找了红书.蓝书,似乎都有些不尽如人意.这两天看到了日本人的白书,重新 ...
- 【树状数组】2019徐州网络赛 query
(2)首先成倍数对的数量是nlogn级别的,考虑每一对[xL,xR](下标的位置,xL < xR)会对那些询问做出贡献,如果qL <= xL && qR >= xR, ...
- Android webView 正确的用法
Android webView 正确的用法 引言: 我在网络找了几个例子,基本上都有问题,<Android疯狂讲义>13.4中的源代码也有问题.终于在官网找到正确的用法.点我. 基本用法: ...
- 配置远程服务器,使hyper-v能够连接网络
一般远程服务器只有一个网卡和IP,如果你要在服务器上装虚拟机,那么要使虚拟机能够连接网络,必须要创建虚拟交换机. 如果创建虚拟交换机并桥接,那么就会改变IP地址,改变IP地址,就连接不上远程服务器.造 ...
- HDU 4763 Theme Section (2013长春网络赛1005,KMP)
Theme Section Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- ICPC 2019 徐州网络赛
ICPC 2019 徐州网络赛 比赛时间:2019.9.7 比赛链接:The Preliminary Contest for ICPC Asia Xuzhou 2019 赛后的经验总结 // 比赛完才 ...
- (四面体)CCPC网络赛 HDU5839 Special Tetrahedron
CCPC网络赛 HDU5839 Special Tetrahedron 题意:n个点,选四个出来组成四面体,要符合四面体至少四条边相等,若四条边相等则剩下两条边不相邻,求个数 思路:枚举四面体上一条线 ...
- POJ-2796 & 2019南昌邀请赛网络赛 I. 区间最大min*sum
http://poj.org/problem?id=2796 https://nanti.jisuanke.com/t/38228 背景 给定一个序列,对于任意区间,min表示区间中最小的数,sum表 ...
- ACM总结——2017区域赛网络赛总结
从省赛回来至今4周,每周周末都在打网络赛,每次都是划水,总结下自己弱弱的ACM吧!划水水~~ 首先是新疆赛区,基本上都是图论相关的东西,全靠队友,自己翻水水,实力躺了5道. 然后是沈阳赛区,终于有点贡 ...
随机推荐
- Ionic2集成DevExtreme
安装Install DevExtreme Angular npm install --save devextreme devextreme-angular 或者在package.json 文件中增加依 ...
- 使用AlarmManager定期执行工作
新建一个Service来模拟后台执行的程序,PollingService.java: package com.ryantang.rtpollingdemo; import android.app.No ...
- juypter-notebook安装配置
juypter-notebook安装配置 Table of Contents 1. jupyter notebook概述 2. jupyter notebook安装 3. 在jupyter noteb ...
- spring boot 监控与管理(actuator)
Spring POMs 中提供了一个特殊的依赖模块,即spring-boot-starter-actuator,我们只需要在我们的POM中添加依赖即可 <!-- 监控 管理 --> < ...
- Nodejs入门边读边想边记(-)
Node入门>>一本全面的Node.js教程网站地址:http://www.nodebeginner.org/index-zh-cn.html 本文记录我在阅读上面这个网站的过程中得到的一 ...
- 【extjs6学习笔记】1.10 初始: 定义类
http://www.extjs-tutorial.com/extjs/define-new-class-in-extjs
- 服务器 PyTorch 报错 重装 PyTorch
两个代码,pix2pix + CycleGan , wgan-gp 都是 pytorch 写的, 在服务器端运行,均存在下列问题,故判定是 pytorch 的安装问题. Traceback (mos ...
- Js面向对象之观察者模式
//模拟一个目标可能拥有的一些列依赖 function ObserverList() { this.observerList = []; }; //添加一个观察者 ObserverList.proto ...
- iframe高度随内容自适应的方法
我们知道,iframe最大的问题,就是高度的问题,如果你内容的高度是变化,要么你就给你的容器写个固定的高度,如果内容是未知的,显然这个方法并不能达到我们的想要的效果,要么就是通过js来解决这个问题. ...
- IOS UIView动画(封装动画)
● UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView 将为这些改变提供动画支持 ● 执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视 图, ...