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. Application.CommonAppDataPath的路径

    Application.CommonAppDataPath; win7的路径 C:\ProgramData\CompanyName\ProductName\2.0.5.1 [assembly: Ass ...

  2. Webform——内嵌word编辑器

    word编辑器,类似于Word的. 首先需要添加两个引用: 然后把一个文件夹仍在根目录下: 继而在工具箱里 选择项→浏览找到这两个引用,直接把工具拽进来就行: 获取编辑器文本: protected v ...

  3. BZOJ2882: 工艺

    题解: 裸的字符串最小表示... 可以戳这里:http://www.cnblogs.com/ACAC/archive/2010/05/23/1742349.html 这里说一下为什么a[i+k]> ...

  4. hbase shell下如何使用删除键

    今天刚安装好了hbase,通过Secure CRT登录hbase shell,敲入错误命令无法使用删除键(Backspace或是Ctrl+Backspace都不管用)删除,后来在终端-->仿真下 ...

  5. static用法详解

    一. 面向过程程序设计 1.静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变量的例子,如下: //Example 1 #include & ...

  6. SOAP Services for Python

    转自:https://pypi.python.org/pypi/SOAPpy/ 1.下载SOAPpy 0.12.5 2.解压tar -xvzf SOAPpy-$VERSION$.tar.gz 3.安装 ...

  7. PICT实现组合测试用例(二)

    上次简单总结了PICT命令的一些用法,这次重新把<软件测试实战>里面有关这一章的内容再总结一次,以巩固理解. 组合测试的概念 组合测试(combinatorial testing)是一种测 ...

  8. Spring 拦截器配置

    Spring interceptor拦截器配置 Spring mvc的拦截器是通过handlerinterceptor来实现的 实现方式: 1.自定义一个类实现Spring的handlerinterc ...

  9. 【转】为什么C++编译器不能支持对模板的分离式编译

    出处:刘未鹏(pongba) http://blog.csdn.net/pongba)   首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h ...

  10. 网页推送库 SignalR

    SignalR 可以用这个库开发网页聊天室应用 ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能 ...