Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash
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 l, r 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 n, m 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
@)1%KBO0HM418$J94$1R.jpg)
代码:
//#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的更多相关文章
- 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. ...
- 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 ...
- 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 ...
- Codeforces Round #337 (Div. 2) D. Vika and Segments (线段树+扫描线+离散化)
题目链接:http://codeforces.com/contest/610/problem/D 就是给你宽度为1的n个线段,然你求总共有多少单位的长度. 相当于用线段树求面积并,只不过宽为1,注意y ...
- 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. 这题 ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- 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所 ...
- 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 ...
- 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 ...
随机推荐
- left (outer) join , right (outer) join, full (outer) join, (inner) join, cross join 区别
z -- -- select a.*,b.* from a left join b on a.k = b.k select a ...
- poj 1459 Power Network(增广路)
题目:http://poj.org/problem?id=1459 题意:有一些发电站,消耗用户和中间线路,求最大流.. 加一个源点,再加一个汇点.. 其实,过程还是不大理解.. #include & ...
- poj 3259 Wormholes(最短路 Bellman)
题目:http://poj.org/problem?id=3259 题意:一个famer有一些农场,这些农场里面有一些田地,田地里面有一些虫洞,田地和田地之间有路,虫洞有这样的性质: 时间倒流.问你这 ...
- 设计模式 - command
将请求封装为对象,从而可以使用不同的请求对客户进行参数化,该模式的关键在于对不同请求的封装.简单的说,也就是在请求发出者和客户间通过command对象进行解耦,从而使得请求者可以通过实例化不同的com ...
- UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)
题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...
- java中正则表达式
在<java编程思想>中,java中的 \\ 表示“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义.”如果想插入一个普通的反斜线,那么应该使用 \\\\. 理解: 我们使用的 ...
- 【转】在Tomcat配置JNDI数据源的三种方式
在我过去工作的过程中,开发用服务器一般都是Tomcat 数据源的配置往往都是在applicationContext.xml中配置一个dataSource的bean 然后在部署时再修改JNDI配置 我猜 ...
- hbase shell下如何使用删除键
今天刚安装好了hbase,通过Secure CRT登录hbase shell,敲入错误命令无法使用删除键(Backspace或是Ctrl+Backspace都不管用)删除,后来在终端-->仿真下 ...
- Zabbix探索:Zabbix API使用时的错误1
好久没来了,最近比较疲倦,估计是从年初到现在没有休息的原因. 刚刚批量导入网络设备到Zabbix时,报错: Cannot implode expression 后面自然是IP和触发器的表达式. 最初还 ...
- Android UI -- 的基础知识。
在介绍基础知识之前先明确几个基本的概念 View 视图是所有可视组件的基类,所有的UI控件包括布局类都是从View派生出来的. ViewGroup ViewGroup是View的扩展,可以放置多个Vi ...