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道. 然后是沈阳赛区,终于有点贡 ...
随机推荐
- C 碎片七 指针
一.地址和指针 程序在编译过程中,系统会根据变量类型分配一定长度的内存单元.内存区中的每个字节都有一个编号,该内存单元的初始编号就是变量的"地址/指针",该内存单元的长度就是变量的 ...
- CSS中box-sizing属性的作用
今天在项目中看到box-sizing这个属性,以前用过,但是不常用!注意,它是CSS3里的属性喔! W3C 盒子模型:标准盒模型,是指块元素box-sizing属性为content-box的盒模型.一 ...
- 构建第一个Spring Boot2.0应用之集成mybatis(六)
一.环境: IDE:IntelliJ IDEA 2017.1.1 JDK:1.8.0_161 Maven:3.3.9 springboot:2.0.2.RELEASE 二.步骤 方式一:利用配置文件配 ...
- zabbix文档3.4-7配置
zabbix文档3.4-7配置 1 主机和主机组 典型的Zabbix主机是您希望监视的设备(服务器,工作站,交换机等). 创建主机是Zabbix中首个监控任务之一.例如,如果要监视服务器"x ...
- sql server 搭建发布订阅后,改端口不正常工作的问题
sql 的发布订阅,想必大家都了解,但一般都是在默认的1433的情况下搭建的,那么1433换成别的端口,发布还能正常工作吗? 在一次客户的真实场景上我就遇到了. 好了,今天不想写太多,简化下, 测试环 ...
- tomcat 启动显示指定的服务未安装
解决方法: 命令行进入tomcat的bin目录 输入“service.bat install” 重启,OK
- VS打包方法(安装和部署简介)——内含大量图片,密症慎入!
友情提示:内含大量文字.图片,密集恐惧症者慎入! 主要记述一下利用微软集成开发环境VS打包的方法和详细步骤. 1.新建打包工程 打开VS,文件->添加项目->新建项目(如图1),在添加新项 ...
- 访问mongo数据库报错
It looks like you are trying to access MongoDB over HTTP on the native driver port. 出错原因: 1.没有安装mong ...
- World Wind Java开发之十——AnalyticSurface栅格渲染(转)
http://blog.csdn.net/giser_whu/article/details/43017881 1.AnalyticSurfaceDemo ArcGIS下对栅格的各种分级渲染效果是非常 ...
- 【BZOJ2427】[HAOI2010] 软件安装(缩点+树形DP)
点此看题面 大致题意: 有\(N\)个软件,每个软件有至多一个依赖以及一个所占空间大小\(W_i\),只有当一个软件的直接依赖和所有的间接依赖都安装了,它才能正常工作并造成\(V_i\)的价值.求在容 ...