ural1989 单点更新+字符串hash
正解是双哈希,不过一次哈希也能解决。。
然后某个数字就对应一个字符串,虽然有些不同串对应同一个数字,但是概率非常小,可以忽略不计。从左到右、从右到左进行两次hash,如果是回文串,那么对应的整数必定存在某种关系(可以理解成相等),对于更新操作,就是单点更新。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#include<algorithm>
#define ll unsigned long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100005
char s[maxn];
ll F[maxn+];
int len;
struct node{
ll suml,sumr;
}tree[maxn<<];//区间保存从左到右和从右到左的hash值
inline void pushup(int rt){
tree[rt].suml=tree[rt<<].suml+tree[rt<<|].suml;
tree[rt].sumr=tree[rt<<].sumr+tree[rt<<|].sumr;
}
void build(int l,int r,int rt){
if(l==r){
tree[rt].suml=F[l-]*(s[l-]-'a');
tree[rt].sumr=F[len-l]*(s[l-]-'a');
return;
}
int m=l+r>>;
build(lson);
build(rson);
pushup(rt);
}
void update(int pos,int val,int l,int r,int rt){//单点更新
if(l==r){
tree[rt].suml=F[l-]*val;
tree[rt].sumr=F[len-l]*val;
return;
}
int m=l+r>>;
if(pos<=m) update(pos,val,lson);
else update(pos,val,rson);
pushup(rt);
}
ll suml,sumr;
void query(int x,int y,int l,int r,int rt){
if(x<=l && y>=r){
suml+=tree[rt].suml;
sumr+=tree[rt].sumr;
return;
}
int m=l+r>>;
if(x<=m) query(x,y,lson);
if(y>m) query(x,y,rson);
}
int main(){
F[]=;
for(int i=;i<=maxn;i++)
F[i]=F[i-]*;//打表处理
int q;
while(scanf("%s",s)!=EOF){
scanf("%d",&q);
len=strlen(s);
build(,len,);
char op[];
int x,y;
while(q--){
scanf("%s",op);
if(op[]=='p'){//查询
scanf("%d%d",&x,&y);
suml=sumr=;
query(x,y,,len,);
int k1=x-;//左到右的长度
int k2=len-y;//右到左的区间长度
if(k1>k2) sumr*=F[k1-k2];
else suml*=F[k2-k1];
cout<<suml<<" "<<sumr<<endl;
if(suml==sumr) puts("YES");
else puts("NO");
}
else {//单点修改
int x;
char tmp[];
scanf("%d%s",&x,tmp);
update(x,tmp[]-'a',,len,);
}
}
}
return ;
}
ural1989 单点更新+字符串hash的更多相关文章
- URAL-1989 Subpalindromes(单点更新+hash)
题目大意:给一行字符串,两种操作:change(pos,char),将pos处字符改为char:isPalindrome(i,j),询问[i,j]之间是否为回文字符串. 题目分析:做正反两次字符串哈希 ...
- 单点更新线段树 RMQ
D. Xenia and Bit Operations time limit per test 2 seconds memory limit per test 256 megabytes input ...
- HDU 1880 魔咒词典 (字符串hash)
<题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...
- 线段树 + 字符串Hash - Codeforces 580E Kefa and Watch
Kefa and Watch Problem's Link Mean: 给你一个长度为n的字符串s,有两种操作: 1 L R C : 把s[l,r]全部变为c; 2 L R d : 询问s[l,r]是 ...
- [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]
题面 传送门 思路 0x01 KMP 一个非常显然而优秀的想法:把模板串按照'*'分段,然后对于每一段求$next$,'?'就当成可以对于任意字符匹配就行了 对于每个文本串,从前往后找第一个可以匹配的 ...
- NYOJ-568/1012//UVA-12299RMQ with Shifts,线段树单点更新+区间查询
RMQ with Shifts 时间限制:1000 ms | 内存限制:65535 KB 难度:3 -> Link1 <- -> Link2 <- 以上两题题意是一样 ...
- Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)
Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...
- CF1200E Compress Words | 字符串hash
传送门 Examples input 1 5 I want to order pizza output 1 Iwantorderpizza input 2 5 sample please ease i ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
随机推荐
- IDEA下搜狗输入法输入中文时卡着不动的参考解决方法
在IntelliJ IDEA工具的java编辑窗口,给代码增加注释时发现,输入中文时,搜狗输入法界面不动,一直卡着,如图: 我想输入“根据”两个字,但搜狗输入法界面一直卡着不刷新,导致都不知道自己输 ...
- nginx安装ngx_lua_waf防护
ngx_lua_waf基于ngx_lua的web应用防火墙,使用起来简单,高性能和轻量级. ♦防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击♦防止svn/备份之类 ...
- CM记录-操作系统调优
1.避免使用swap分区---将hadoop守护进程的数据交换到磁盘的行为可能会导致操作超时:物理内存(交换)--Swap分区 2.调整内存分配策略---操作系统内核根据vm.overcommit_m ...
- 使用ResourceBundle读取配置文件
在Java语言中,使用一种以.properties为扩展名的文本文件作为资源文件,该类型的文件的内容格式为类似: 12 #注释语句 some_key=some_value 形式.以#开头的行作为注释行 ...
- Hyper-V和其他虚拟机共存 【转】
由于Windows中Hyper-V的实现方式在系统中为独占,所以其不能与其他的虚拟机共存. 下面的方法是在系统中新增一个启动项,在这个启动项中关闭Hyper-V,这样就可以安装并使用其他虚拟机了.需要 ...
- [BJWC2011]最小三角形(分治+最近点对)
题面:BJWC2011 最小三角形 \(solution:\) 昨天才学完平面最近点对,今天就要求平面最近的三个点,显然不是巧合. 仔细一思考,我们用来求平面最近点对的方法不就可以用到三个点上吗? 就 ...
- C# 对List中的Object进行排序
首先定义一个List类,这个类里面包含了Name和Total两个属性变量,下面就是针对这两个变量进行排序. public class Player { public string Name { get ...
- 给父元素与子元素分别设置visibility注意点
由于机顶盒的终端特性原因,不能用display:hidden去做隐藏,就选择了visibility:hidden. 在这里遇到一个现象: 给父元素设置了hidden,但是里面的子元素依然可见.以为只是 ...
- getattr getattribute setattr hasattr delattr
getattr是返回对象属性value的函数,用法:getattr(object,attribute_name[,default]) 如果对象拥有属性,则返回属性value,如果对象没有该属性并且也没 ...
- JQuery基础概念--$符号的实质
$符号的实质 //$其实就是一个函数,以后用$的时候,记得跟小括号 $(); //参数不同,功能就不同 //3种用法 //1. 参数是一个function, 入口函数 $(function () { ...