终于补好了。

题目链接: http://codeforces.com/contest/580/problem/E

E. Kefa and Watch
time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

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 test(s)
Input
3 1 2
112
2 2 3 1
1 1 3 8
2 1 2 1
Output
NO
YES
Input
6 2 3
334934
2 2 5 2
1 4 4 3
2 1 6 3
1 2 3 8
2 3 6 1
Output
NO
YES
NO
Note

In the first sample test two checks will be made. In the first one substring "12" is checked on whether or not it has period 1, so the answer is "NO". In the second one substring "88", is checked on whether or not it has period 1, and it has this period, so the answer is "YES".

In the second statement test three checks will be made. The first check processes substring "3493", which doesn't have period 2. Before the second check the string looks as "334334", so the answer to it is "YES". And finally, the third check processes substring "8334", which does not have period 1.

大意是:给一个字符串,修改一个区间都为一个值,区间询问区间的两端是否完全相等。

当然HASH啦,但是类似自然溢出会被卡(CF有特殊的卡HASH的技巧,自然溢出就是用unsigned long long 这种,相当于mod 2^64)

这里用双hash,貌似很难很难卡。

HASH1=10^9+9,HASH2=10^9+7

然后就是区间修改,和区间询问,区间修改学的差,看了好久才懂

  1 #include<bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 #define N 100005
  6 #define mod1 1000000009
  7 #define mod2 1000000007
  8 
  9 
 10 typedef long long ll;
 11 const int  c1=;
 12 const int  c2=;
 13 int pow_c1[N],pow_c2[N],sum_c1[N],sum_c2[N];
 14 
 15 struct node{
 16     int l,r;
 17     int h1,h2;
 18     int lazy;
 19     node(){
 20     lazy=-;
 21     }
 22     void make_lazy(int x)
 23     {
 24         lazy=x;
 25         h1=1ll*sum_c1[r-l]*x%mod1;
 26         h2=1ll*sum_c2[r-l]*x%mod2;
 27     }
 28 }tree[N<<];
 29 
 30 void lazy_sons(int rt)
 31 {
 32     if (tree[rt].lazy!=-)
 33     {
 34         tree[rt<<].make_lazy(tree[rt].lazy);
 35         tree[rt<<|].make_lazy(tree[rt].lazy);
 36         tree[rt].lazy=-;
 37     }
 38 }
 39 
 40 void unite(node &a,node b,node &c){
 41      a.h1=(1ll*b.h1*pow_c1[c.r-c.l+]%mod1+c.h1)%mod1;
 42      a.h2=(1ll*b.h2*pow_c2[c.r-c.l+]%mod2+c.h2)%mod2;
 43 }
 44 char s[N];
 45 void build(int l,int r,int rt)
 46 {
 47     tree[rt].l=l,tree[rt].r=r;
 48     tree[rt].lazy=-;
 49     if (l==r)
 50     {
 51         tree[rt].h1=tree[rt].h2=(s[l]-''+);
 52         return;
 53     }
 54     int mid=(l+r)>>;
 55     build(l,mid,rt<<);
 56     build(mid+,r,rt<<|);
 57     unite(tree[rt],tree[rt<<],tree[rt<<|]);
 58 }
 59 void update(int l,int r,int val,int rt)
 60 {
 61     if (tree[rt].l==l&&tree[rt].r==r)
 62     {
 63         tree[rt].make_lazy(val);
 64         return;
 65     }
 66     lazy_sons(rt);
 67     int mid=(tree[rt].l+tree[rt].r)>>;
 68     if (r<=mid) update(l,r,val,rt<<);
 69     else if (l>mid) update(l,r,val,rt<<|);
 70     else {
 71         update(l,mid,val,rt<<);
 72         update(mid+,r,val,rt<<|);
 73     }
 74     unite(tree[rt],tree[rt<<],tree[rt<<|]);
 75 }
 76 node ans;
 77 void query(int l,int r,int rt)
 78 {
 79     if (tree[rt].l==l&&tree[rt].r==r){
 80         unite(ans,ans,tree[rt]);
 81         return;
 82     }
 83     lazy_sons(rt);
 84     int mid=(tree[rt].l+tree[rt].r)>>;
 85     if (r<=mid) query(l,r,rt<<);
 86     else if (l>mid) query(l,r,rt<<|);
 87     else {
 88         query(l,mid,rt<<);
 89         query(mid+,r,rt<<|);
 90     }
 91 }
 92 int main()
 93 {
 94     pow_c1[]=sum_c1[]=;
 95     pow_c2[]=sum_c2[]=;
 96 
 97     for (int i=;i<N;i++)
 98     {
 99         pow_c1[i]=1ll*pow_c1[i-]*c1%mod1;
         pow_c2[i]=1ll*pow_c2[i-]*c2%mod2;
         sum_c1[i]=(1ll*sum_c1[i-]+pow_c1[i])%mod1;
         sum_c2[i]=(1ll*sum_c2[i-]+pow_c2[i])%mod2;
     }
     int n,m,k;
     scanf("%d%d%d",&n,&m,&k);
 
     scanf("%s",s+);
     build(,n,);
     m+=k;
     int tp,l,r,c;
     int aa,bb,cc,dd;
     while (m--)
     {
         scanf("%d%d%d%d",&tp,&l,&r,&c);
         if (tp==) update(l,r,c+,);
         else
         {
             ans.h1=ans.h2=;
             if (l<=r-c) query(l,r-c,);
             aa=ans.h1;
             bb=ans.h2;
             ans.h1=ans.h2=;
             if (l+c<=r) query(l+c,r,);
             cc=ans.h1,dd=ans.h2;
             if (aa==cc&&bb==dd) cout<<"YES"<<endl;
             else cout<<"NO"<<endl;
 
         }
     }
     return ;
 }

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

  1. 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/prob ...

  2. Codeforces Round #321 (Div. 2) C. Kefa and Park dfs

    C. Kefa and Park Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/probl ...

  3. Codeforces Round #321 (Div. 2) B. Kefa and Company 二分

    B. Kefa and Company Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/pr ...

  4. Codeforces Round #321 (Div. 2) A. Kefa and First Steps 水题

    A. Kefa and First Steps Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/58 ...

  5. codeforces水题100道 第十四题 Codeforces Round #321 (Div. 2) A. Kefa and First Steps (brute force)

    题目链接:http://www.codeforces.com/problemset/problem/580/A题意:求最长连续非降子序列的长度.C++代码: #include <iostream ...

  6. Codeforces Round #321 (Div. 2) D. Kefa and Dishes(状压dp)

    http://codeforces.com/contest/580/problem/D 题意: 有个人去餐厅吃饭,现在有n个菜,但是他只需要m个菜,每个菜只吃一份,每份菜都有一个欢乐值.除此之外,还有 ...

  7. 「日常训练」Kefa and Dishes(Codeforces Round #321 Div. 2 D)

    题意与分析(CodeForces 580D) 一个人有\(n\)道菜,然后要点\(m\)道菜,每道菜有一个美味程度:然后给你了很多个关系,表示如果\(x\)刚好在\(y\)前面做的话,他的美味程度就会 ...

  8. 「日常训练」Kefa and Park(Codeforces Round #321 Div. 2 C)

    题意与分析(CodeForces 580C) 给你一棵树,然后每个叶子节点会有一家餐馆:你讨厌猫(waht?怎么会有人讨厌猫),就不会走有连续超过m个节点有猫的路.然后问你最多去几家饭店. 这题我写的 ...

  9. 「日常训练」Kefa and Company(Codeforces Round #321 Div. 2 B)

    题意与分析(CodeForces 580B) \(n\)个人,告诉你\(n\)个人的工资,每个人还有一个权值.现在从这n个人中选出m个人,使得他们的权值之和最大,但是对于选中的人而言,其他被选中的人的 ...

  10. Codeforces Round #321 (Div. 2) Kefa and Dishes 状压+spfa

    原题链接:http://codeforces.com/contest/580/problem/D 题意: 给你一些一个有向图,求不超过m步的情况下,能获得的最大权值和是多少,点不能重复走. 题解: 令 ...

随机推荐

  1. iOS开发--使用OpenSSL生成私钥和公钥的方法

    最近要在新项目中使用支付宝钱包进行支付,所以要调研对接支付宝的接口,支付宝开放平台采用了RSA安全签名机制,开发者可以通过支付宝   公钥验证消息来源,同时可使用自己的私钥对信息进行加密,所以需要在本 ...

  2. 【图论 动态规划拆点】luoguP3953 逛公园

    经典的动态规划拆点问题. 题目描述 策策同学特别喜欢逛公园.公园可以看成一张 NN 个点 MM 条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口, NN 号点是公园的出口,每条边有一个非负 ...

  3. windows 7虚拟机与主机不能互ping通,但是都能与网关ping通

    这里是在Windows 10的环境下使用VMware安装了一个Windows 7的虚拟机,虚拟机中是使用桥接的方式.结果发现虚拟机不能与物理机互通,但是却能与网关互通.查看虚拟机和物理机的IP发现都是 ...

  4. CentOS6、7安装MySQL5.7全教程

    CentOS6.7安装MySQL5.7全教程 做开发总得用到数据吧,Linux作为服务器,总得有一个数据库来存储测试用的数据,所以呢,这里附上CentOS6.7安装MySQL5.7的教程喔~ 用到的工 ...

  5. python3.x 多路IO复用补充asyncio

    asyncio模块是python之父写的模块,按说应该是靠谱的,python3.6版本定义为稳定版本. 说明书:https://docs.python.org/3/library/asyncio.ht ...

  6. RN在设备上运行

    https://facebook.github.io/react-native/docs/running-on-device.html 在发布之前,最好是在真实的设备上测试一下应用.如果是通过crea ...

  7. 如何用纯 CSS 创作一个蝴蝶标本展示框

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/xzgZzQ 可交互视频教 ...

  8. CSS3-盒模型-resize属性

    作用:用来改变元素尺寸大小. 1.resize:none|both|horizontal|vertical|inherit none:不能拖动修改尺寸大小 both:可以拖动元素,修改元素宽高 hor ...

  9. perl:split函数用法

    本文和大家重点讨论一下Perl split函数的用法,Perl中的一个非常有用的函数是Perl split函数-把字符串进行分割并把分割后的结果放入数组中.这个Perl split函数使用规则表达式( ...

  10. Day09文件操作

    1.什么是文件 文件:操作系统为应用程序或者用户提供的一种操作硬盘的虚拟单位 强调:①文件是操作系统提供的虚拟单位②应用程序或者用户对文件的读写操作其实都是向操作系统发送指令 2.为什么要用文件 文件 ...