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. 深入理解Java虚拟机 - 垃圾收集概述

    首先需要澄清的是,垃圾收集(GC)的历史远比Java要久远,当我们意识到手动管理内存所带来的麻烦时,懒惰的天性推动先驱们寻找更为简单.易用.关键是傻瓜式的内存管理技术.GC技术起源于1960年诞生于M ...

  2. 逆序对的相关问题:bzoj1831,bzoj2431

    先从简单一点的bzoj2431入手: n个数1~n已经限定了,所以 对于1~i-1,新加入i,最多可以增加i-1个逆序对,最少增加0个逆序对 f[i,j]表示1~i形成的序列逆序对为j的方案数 比较容 ...

  3. Nhibernate与Dapper对比,及Nhibernate增删改和9种查询语法

    1,Sql语法. NH:HQL Dapper:原生Sql. 点评:原生Sql可以直接放在数据库里执行,Hql不行,且Hql增加学习负担.(Hn也可以原生Sql,但好像用的不多呀) 2,开发速度. NH ...

  4. UVa 1605 (构造) Building for UN

    题意: 有n个国家,要设计一栋长方体的大楼,使得每个单位方格都属于其中一个国家,而且每个国家都要和其他国家相邻. 分析: 紫书上有一种很巧妙的构造方法: 一共有2层,每层n×n.一层是每行一个国家,另 ...

  5. [swustoj 1094] 中位数

    中位数(1094) 问题描述 中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本.种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分.对于有限的数集,可以通过把所有 ...

  6. apache开源项目--ZooKeeper

    ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关键服务 ...

  7. 【转】Android之NDK开发

    原文网址:http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html 一.NDK产生的背景 Android平台从诞生起,就已经支 ...

  8. 【转】COCOS2D-X之CCHttpRequest下载图片Demo

    #include "pthread.h" #pragma comment(lib,"libcurl_imp.lib") #pragma comment(lib, ...

  9. 任务栏窗口和状态图标的闪动 z

    Demo程序: 实现任务栏窗体和图标的闪动: 整个程序是基于Windows Forms的,对于任务栏右下角状态图标的闪动,创建了一个类型:NotifyIconAnimator,基本上是包装了Windo ...

  10. e2e 自动化集成测试 环境搭建 Node.js Selenium WebDriverIO Mocha Node-Inspector

    Node.js已经出来了许多年载,至今才开始接触.周未在家闲来无事,一时心血来潮,Google了大量的文章,经过实验,终于可以把整个环境给搭起来, 废话不多话,请看步骤. 特别注意, 本文章是针对Wi ...