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道. 然后是沈阳赛区,终于有点贡 ...
随机推荐
- ASP.NET MVC缓存
根据缓存的位置不同,可以区分为: ①客户端缓存(缓存在用户的客户端,例如浏览器中) ②服务器缓存(缓存在服务器中,可以缓存在内存中,也可以缓存在文件里,并且还可以进一步地区分为本地缓存和分布式缓存两种 ...
- Sql server 数据库的备份和还原数据库提示“ 加载的介质已格式化为支持 1 个介质簇,但根据指定的备份设备,应支持 2 个介质簇”
数据库备份和还原总结 在 "M:\2017-Pro\company\other\databak_2014-10\anquanbaowei_db_201704300200.BAK" ...
- wepy-cli 开发小程序如何使用vant组件
同样使用wepy-cli快速生成的小程序,目前可以使用组件: 直接通过 git 下载 Vant Weapp 源代码,并将dist目录拷贝到自己的项目中 git clone https://github ...
- 自定义列表dl
语法格式 <dl> <dt>名词1</dt> <dd>名词1解释1</dd> <dd>名词1解释2</dd> ... ...
- git 初始化仓库与远程clone
使用命令 git –bare init /home/git/myRep.git,初始化化仓库 在gitClient_01上,通过git clone命令进行克隆远程仓库,并在各自的电脑上运行开发. Gi ...
- Android中渐变图片失真的解决方案
在android开发(尤其是android游戏开发)中有一个很严重的问题就是带有渐变效果的png图片会出现严重的banding(色带),鉴于这种情况,有几种可行的解决方法: 1.如果Activit ...
- Hibernate数据库的操作
参考网址: https://www.cnblogs.com/jack1995/p/6952704.html 1.最简单的查询 List<Special> specials = (List& ...
- 使用CSS设置Chrome打印背景色
以下内容适用于Chrome浏览器 打印背景色可以通过在打印预览页面勾选背景图形实现 如果需要在用户不勾选的情况下依然能够打印背景色,可以通过css实现,如,table隔行设置背景色: .data-ta ...
- C++ vector常用法
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<in ...
- php生成纯数字、字母数字、图片、纯汉字的随机数验证码
现在讲开始通过PHP生成各种验证码旅途,新手要开车了,请刷卡! 首先,我们开始先生成一个放验证码的背景图片 注:没有Imagejpg()这个函数,只有imagepng()函数 imagecreatet ...