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创建多模块springboot项目
需求:一个父模块 下面几个子模块 其中一个模块是springboot结构.其他两个普通jar类型 有许多坑,都在注释里面写着呢.注意看父模块和demo模块的注释. com.imooc.securi ...
- JavaScript Array() 对象:push() 和 join() 方法
<script> var fruits = ["Banana", "Orange", "Apple", "Mango& ...
- 解决iOS10下Meta设置user-scalable=no无效问题
苹果为了提高Safari中网站的辅助功能,屏蔽了Meta下的user-scalable=no功能 所以在iOS10下面,就算加上user-scalable=no,Safari浏览器也能支持手动缩放 解 ...
- 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法
一,LRU算法介绍 LRU是内存分配中“离散分配方式”之分页存储管理方式中用到的一个算法.每个进程都有自己的页表,进程只将自己的一部分页面加载到内存的物理块中,当进程在运行过程中,发现某页面不在物理内 ...
- 序列化时提示There was an error reflecting type 'System.Collections.Generic.List`1
序列化xml文件到List中,非win10下出现了这个错误,但是在win10下正常.经过仔细的研究,发现是序列化工具类不能使用Static.去掉Static即可.
- offset[Parent/Width/Height/Top/Left] 、 client[Width/Height/Top/Left] 、 Element.getBoundingClientRect()
开篇提示:以下内容都经个人测试,参考API文档总结,但还是不能保证完全正确,若有错误,还请留言指出___________________________________________________ ...
- dense prediction
Dense prediction fully convolutional network for sementic segmentation 先用feature extractor 提特征,然后再使 ...
- Java SE之正则表达式Demo
@Test public void regex() {//匹配教务系统课程 // String content = "公共机座 (1-10)".replaceAll(" ...
- freemark简单事例
工作准备:开发环境myeclipse freemarker.jar(需要下载) 首先引入freemarker.jar包.然后,,,,直接贴代码: 1.创建一个FreemarkerUtil类: pack ...
- python cookbook 笔记三
分组: rows = [ {'address': '5412 N CLARK', 'date': '07/01/2012'}, {'address': '5148 N CLARK', 'date': ...