E. Kefa and Watch

Time Limit: 1 Sec

Memory Limit: 256 MB

题目连接

http://codeforces.com/contest/580/problem/E

Description

One day Kefa the parrot was walking down the street as he was on the way home from the restaurant when he saw something glittering by the road. As he came nearer he understood that it was a watch. He decided to take it to the pawnbroker to earn some money.

The pawnbroker said that each watch contains a serial number represented by a string of digits from 0 to 9, and the more quality checks this number passes, the higher is the value of the watch. The check is defined by three positive integers lr and d. The watches pass a check if a substring of the serial number from l to r has period d. Sometimes the pawnbroker gets distracted and Kefa changes in some substring of the serial number all digits to c in order to increase profit from the watch.

The seller has a lot of things to do to begin with and with Kefa messing about, he gave you a task: to write a program that determines the value of the watch.

Let us remind you that number x is called a period of string s (1 ≤ x ≤ |s|), if si  =  si + x for all i from 1 to |s|  -  x.

Input

The first line of the input contains three positive integers nm and k (1 ≤ n ≤ 105, 1 ≤ m + k ≤ 105) — the length of the serial number, the number of change made by Kefa and the number of quality checks.

The second line contains a serial number consisting of n digits.

Then m + k lines follow, containing either checks or changes.

The changes are given as 1 l r с (1 ≤ l ≤ r ≤ n, 0 ≤ c ≤ 9). That means that Kefa changed all the digits from the l-th to the r-th to be c.

The checks are given as 2 l r d (1 ≤ l ≤ r ≤ n, 1 ≤ d ≤ r - l + 1).

Output

For each check on a single line print "YES" if the watch passed it, otherwise print "NO".

Sample Input

3 1 2
112
2 2 3 1
1 1 3 8
2 1 2 1
 

Sample Output

NO
YES

HINT

题意

给你一个字符集只有10的串 ,然后又两个操作

1.区间更新

2.查询lr区间的字符的周期是否为d

题解:

直接暴力线段树hash就好了

查询操作只有判断(l,l+len-d)和(l+len-d+1,r)是否一样就好了

可以用类似错位来解释

代码来自peterpan

代码:

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
#define input freopen("/Users/peteryuanpan/data.txt","r",stdin) #define N 100010
int n, m, k, lens;
char s[N]; #define lch id<<1
#define rch id<<1|1
class HashTree{
public:
int mod, p;
ll powp[N], sump[N];
void getpowp(){
powp[] = ;
sump[] = ;
for(int i = ; i < N; i++){
powp[i] = powp[i-] * p;
if(powp[i] >= mod) powp[i] %= mod; sump[i] = sump[i-] + powp[i];
if(sump[i] >= mod) sump[i] %= mod;
}
}
ll v[N << ];
int len[N << ];
char lazy[N << ];
void plant(int id,int l,int r){
lazy[id] = '\0';
if(l == r){
v[id] = s[l];
len[id] = ;
return;
}
int mid = (l + r) >> ;
plant(lch, l, mid);
plant(rch, mid + , r);
len[id] = len[lch] + len[rch];
v[id] = v[lch] * powp[len[rch]] + v[rch];
if(v[id] >= mod) v[id] %= mod;
}
void pushdown(int id){
if(lazy[id] != '\0'){
lazy[lch] = lazy[rch] = lazy[id]; v[lch] = lazy[id] * sump[len[lch] - ];
if(v[lch] >= mod) v[lch] %= mod; v[rch] = lazy[id] * sump[len[rch] - ];
if(v[rch] >= mod) v[rch] %= mod; lazy[id] = '\0';
}
}
void update(int id,int ql,int qr,int l,int r,char c){
if(ql == l && qr == r){
lazy[id] = c;
v[id] = c * sump[len[id] - ];
if(v[id] >= mod) v[id] %= mod;
return;
}
pushdown(id);
int mid = (l + r) >> ;
if(qr <= mid) update(lch, ql, qr, l, mid, c);
else if(mid < ql) update(rch, ql, qr, mid + , r, c);
else update(lch, ql, mid, l, mid, c), update(rch, mid + , qr, mid + , r, c); v[id] = v[lch] * powp[len[rch]] + v[rch];
if(v[id] >= mod) v[id] %= mod;
}
ll query(int id,int ql,int qr,int l,int r){
if(ql == l && qr == r){
return v[id];
}
pushdown(id);
int mid = (l + r) >> ;
if(qr <= mid) return query(lch, ql, qr, l, mid);
else if(mid < ql) return query(rch, ql, qr, mid + , r);
else{
ll t1 = query(lch, ql, mid, l, mid);
ll t2 = query(rch, mid + , qr, mid + , r);
ll t = t1 * powp[qr - (mid + ) + ] + t2;
if(t >= mod) t %= mod;
return t;
}
}
}tree1, tree2; bool equal(int l1, int r1, int l2, int r2){
if(tree1.query(, l1, r1, , lens - ) != tree1.query(, l2, r2, , lens - )) return false;
if(tree2.query(, l1, r1, , lens - ) != tree2.query(, l2, r2, , lens - )) return false;
return true;
} bool judge(int l, int r, int d){
if(r - l + == d) return true;
int l2 = l + d, r2 = r;
int len = r2 - l2 + ;
int l1 = l, r1 = l1 + len - ;
return equal(l1, r1, l2, r2);
} int main(){
//input;
tree1.mod = 1e9 + , tree1.p = , tree1.getpowp();
tree2.mod = 1e9 + , tree2.p = , tree2.getpowp();
scanf("%d%d%d",&n,&m,&k); scanf("%s",s);
lens = (int)strlen(s);
tree1.plant(, , lens - ), tree2.plant(, , lens - ); for(int i = ; i <= m + k; i++){
int ty, l, r;
scanf("%d%d%d",&ty,&l,&r);
l--, r--;
if(ty == ){
char c[];
scanf("%s",c);
tree1.update(, l, r, , lens - , c[]);
tree2.update(, l, r, , lens - , c[]);
}
else{
int d;
scanf("%d",&d);
printf("%s\n", judge(l, r, d) ? "YES" : "NO");
}
} return ;
}

Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash的更多相关文章

  1. Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树

    C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...

  2. Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树

    题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...

  3. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

  4. Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)

    题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...

  5. Codeforces Round #149 (Div. 2) E. XOR on Segment (线段树成段更新+二进制)

    题目链接:http://codeforces.com/problemset/problem/242/E 给你n个数,m个操作,操作1是查询l到r之间的和,操作2是将l到r之间的每个数xor与x. 这题 ...

  6. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  7. Codeforces Round #207 (Div. 1) A. Knight Tournament (线段树离线)

    题目:http://codeforces.com/problemset/problem/356/A 题意:首先给你n,m,代表有n个人还有m次描述,下面m行,每行l,r,x,代表l到r这个区间都被x所 ...

  8. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树

    E. A Simple Task 题目连接: http://www.codeforces.com/contest/558/problem/E Description This task is very ...

  9. Codeforces Round #223 (Div. 2) E. Sereja and Brackets 线段树区间合并

    题目链接:http://codeforces.com/contest/381/problem/E  E. Sereja and Brackets time limit per test 1 secon ...

随机推荐

  1. python中的commands模块

    commands模块用于调用shell命令 有3中方法: commands.getstatus()   返回执行状态 commands.getoutput()   返回执行结果 commands.ge ...

  2. poj 1789 Truck History(最小生成树)

    模板题 题目:http://poj.org/problem?id=1789 题意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b ...

  3. 西南科技大学第十一届ACM程序设计大赛发言稿

    西南科技大学第十一届ACM程序设计大赛发言稿 各位老师.志愿者及参赛选手: 大家好,我是来自计科学院卓软1301的哈特13,很荣幸今天能站在这里代表参赛选手发言. 回想起来,我参加ACM比赛已经快两年 ...

  4. UVA 1324 The Largest Clique 最大团(强连通分量,变形)

    题意:给一个有向图,要求找出一些点,使得这些点中的任意点对,要么可以互通,要么单向可达. 思路:最低只要求单向可达即可,即a->b都可以算进去. 强连通分量内的点肯定是满足要求的,可以全选,但是 ...

  5. 精简版、GHOST版win7,arduino驱动安装失败的解决方法分享

    arduino组件安装驱动不成功,总是提示系统找不到指定文件. 原因是因为精简版缺少了两个关键的系统文件,导致无法安装.mdmcpq.inf  和 usbser.sys 解决方案详见帖子http:// ...

  6. erlang mnesia 数据库实现SQL查询

    Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...

  7. Oracle函数:求两个数的最小公倍数

    CREATE or replace function GetGbs(num1 NUMBER,num2 NUMBER) RETURN NUMBER is resultnum NUMBER; maxnum ...

  8. Struts2 Spring Hibernate Ajax Java总结(实时更新)

    1. 在form表单的onload属性里的方法无法执行? 若忘记了在<%=request.getSession().getAttribute("userName")%> ...

  9. HTTP 报文总结、外送两本电子书

    写在前面的话:喜欢这个比喻:如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹. HTTP是一个应用层协议,研究它的内容的确很枯燥,没啥意思,都是规定好的,我们只需要知道是什么就好了 ...

  10. matlab 函数说明—conv2

    conv 是卷积的意思,2表示2维卷积.   conv2的调用形式如下: 1. C = conv2(A,B) 这是最简单的一种调用形式,B作为卷积核在A的范围内滑动,若[ma na] =size(A) ...