用线段树维护哈希,类似于进位制的一个哈希 a[i]*p^i+a[i-1]*p^i-1...

然后,线段树存在某区间的哈希的值,对于更新,则只需提前计算出整段的哈希值即可。

判断是否相等,由于相隔为d,只需计算(l+d,r),(l,r-d)两段哈希的值是否相等即可。为了防止一次哈希可能使不符合条件的值哈希值相等,所以进行了两次哈希。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define LL long long
using namespace std; const int MAX=100010;
const LL m1=1000000007;
const LL m2=1000000009;
const int g1=47;
const int g2=67; char str[MAX]; struct HASH{
LL seg[MAX<<2]; int lazy[MAX<<2];
LL bits[10][MAX]; LL mod,gt; LL ebit[MAX];
void init(LL m,LL g){
mod=m; gt=g;
for(int i=0;i<MAX;i++){
if(i==0) ebit[i]=1;
else {
ebit[i]=(ebit[i-1]*gt)%mod;
}
}
for(int i=0;i<=9;i++){
bits[i][0]=0;
for(int j=1;j<MAX;j++){
bits[i][j]=(bits[i][j-1]*gt%mod+i)%mod;
}
}
}
void push_up(int rt,int l,int r){
seg[rt]=(seg[rt<<1|1]+seg[rt<<1]*ebit[r-(l+r)/2])%mod;
}
void push_down(int rt,int l,int r){
if(lazy[rt]!=-1){
int m=(l+r)>>1;
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
seg[rt<<1]=bits[lazy[rt]][m-l+1];
seg[rt<<1|1]=bits[lazy[rt]][r-m];
lazy[rt]=-1;
}
}
void build(int rt,int l,int r){
if(l==r){
seg[rt]=(str[l]-'0')%mod;
lazy[rt]=-1;
return ;
}
int m=(l+r)>>1;
build(rt<<1,l,m);
build(rt<<1|1,m+1,r);
push_up(rt,l,r);
lazy[rt]=-1;
}
void update(int rt,int l,int r,int L,int R,int d){
if(l<=L&&R<=r){
lazy[rt]=d;
seg[rt]=bits[d][R-L+1];
return ;
}
int m=(L+R)>>1;
push_down(rt,L,R);
if(m>=l)
update(rt<<1,l,r,L,m,d);
if(m+1<=r)
update(rt<<1|1,l,r,m+1,R,d);
push_up(rt,L,R);
}
void query(int rt ,int l,int r,int L,int R,LL &res){
if(l<=L&&R<=r){
res=(res*ebit[R-L+1]+seg[rt])%mod;
return ;
}
push_down(rt,L,R);
int m=(L+R)>>1;
if(m>=l)
query(rt<<1,l,r,L,m,res);
if(m+1<=r) query(rt<<1|1,l,r,m+1,R,res);
} bool check(int l,int r,int d,int n){
if(r-l+1==d) return true;
LL lrt=0; query(1,l,r-d,1,n,lrt);
LL rrt=0; query(1,l+d,r,1,n,rrt);
if(lrt==rrt) return true;
return false;
}
}a,b; int main(){
// cout<<"OK"<<endl;
int n,m,k,op,l,r,d;
// cout<<"OK"<<endl;
// HASH a,b;
/// cout<<"OK"<<endl;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
scanf("%s",str+1);
a.init(m1,g1);
b.init(m2,g2);
a.build(1,1,n);
b.build(1,1,n);
/// cout<<"YES"<<endl;
m+=k;
while(m--){
scanf("%d%d%d%d",&op,&l,&r,&d);
if(op==1){
a.update(1,l,r,1,n,d);
b.update(1,l,r,1,n,d);
}
else{
if(a.check(l,r,d,n)&&b.check(l,r,d,n)){
puts("YES");
}
else puts("NO") ;
}
}
}
return 0;
}

CF #321 (Div. 2) E的更多相关文章

  1. CF #321 (Div. 2) D

    不说了,爆内存好几次,后来醒起状态有重复... 状压+TSP #include <iostream> #include <cstdio> #include <cstrin ...

  2. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

  3. CF #375 (Div. 2) D. bfs

    1.CF #375 (Div. 2)  D. Lakes in Berland 2.总结:麻烦的bfs,但其实很水.. 3.题意:n*m的陆地与水泽,水泽在边界表示连通海洋.最后要剩k个湖,总要填掉多 ...

  4. CF #374 (Div. 2) D. 贪心,优先队列或set

    1.CF #374 (Div. 2)   D. Maxim and Array 2.总结:按绝对值最小贪心下去即可 3.题意:对n个数进行+x或-x的k次操作,要使操作之后的n个数乘积最小. (1)优 ...

  5. CF #374 (Div. 2) C. Journey dp

    1.CF #374 (Div. 2)    C.  Journey 2.总结:好题,这一道题,WA,MLE,TLE,RE,各种姿势都来了一遍.. 3.题意:有向无环图,找出第1个点到第n个点的一条路径 ...

  6. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

  7. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组

    题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...

  8. CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)

    转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...

  9. CF#138 div 1 A. Bracket Sequence

    [#138 div 1 A. Bracket Sequence] [原题] A. Bracket Sequence time limit per test 2 seconds memory limit ...

随机推荐

  1. SpringBoot SpringDataJPA 动态查询、多条件查询

    Spring-data - JPA用的还是比较多的,之前在公司也一直在用,因为方便.下面我们来整理一下如何配置. pom.xml <?xml version="1.0" en ...

  2. ACM_“打老虎”的背后(简单并查集)

    “打老虎”的背后 Time Limit: 2000/1000ms (Java/Others) Problem Description: “习大大”自担任国家主席以来大力反腐倡廉,各地打击贪腐力度也逐步 ...

  3. Android内存管理(11)*常见JVM回收机制「Java进程内存堆分代,JVM分代回收内存,三种垃圾回收器」

    参考: http://www.blogjava.net/rosen/archive/2010/05/21/321575.html 1,Java进程内存堆分代: 典型的JVM根据generation(代 ...

  4. Unity Toast插件(UGUI版)

    简介 介于自己之前经历的一些开发过程,非常希望unity能有类似Toast的功能用于一些简单的信息显示.但是找来找去找了半天,都木有发现,实在是憋不住了,自己写了个,感觉还可以用,发出来共享一下... ...

  5. conda python虚拟环境

    #查看已安装的python包 conda list #查看当前有哪些虚拟环境 conda env list 或者 conda info -e #更新conda conda update conda # ...

  6. iOS - UITableView 多选功能实现

    :自定义Cell中的代码 #import <UIKit/UIKit.h> @interface TestCell : UITableViewCell @property(nonatomic ...

  7. Cookie localStorage sessionStorage

    三者的异同 特性 Cookie localStorage sessionStorage 数据的生命期 可设置失效时间,默认是关闭浏览器后失效 除非被清除,否则永久保存 仅在当前会话下(tab标签页)有 ...

  8. Python之IPython开发实践

    Python之IPython开发实践 1. IPython有行号. 2. Tab键自动完成,当前命名空间任何与已输入字符串相匹配的变量就会被找出来. 3. 内省机制,在变量前或者后面加上(?)问号,就 ...

  9. tomcat报错org.springframework.web.context.ContextLoaderListener找不到

    tomcat报错org.springframework.web.context.ContextLoaderListener找不到. 最后解决办法:将jar包copy到web-inf下面的lib中. 你 ...

  10. [Windows Server 2012] PHPWind安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★[护卫神·V课堂]是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:PHPWin ...