题目大意:给你一个由0-9组成的字符串,有m个询问,两种操作,第一种将l到r的字符全部变成c,第二种问l到r这段

字符串的循环节是不是d。

思路:首先我们要知道怎么判断字符串的循环节的长度是不是d,如果这个字符串小于等于d,那么肯定是的,否则,如果l 到 r-d

和l+d 到 r 这两段字符串则循环节的长度是d,反之不是。 然后我们就用线段树维护区间字符串哈希值就好啦。

#include<bits/stdc++.h>
#define read(x) scanf("%d",&x)
#define lread(x) scanf("%lld",&x)
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
using namespace std; typedef long long ll;
const int N=1e5+;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int mod=;
const int base=; int n,m,k;
ll b[N],sum[N]; struct seg_tree
{
struct node
{
ll hs;
int l,r,lazy;
}a[N<<];
void up(int l,int r,int rt)
{
int mid=(l+r)>>;
int len=r-mid;
a[rt].hs=(a[rt<<].hs*b[len]+a[rt<<|].hs)%mod;
}
void down(int l,int r,int rt)
{
if(a[rt].lazy==-) return;
int c=a[rt].lazy; a[rt].lazy=-;
a[rt<<].lazy=a[rt<<|].lazy=c;
int mid=(l+r)>>;
a[rt<<].hs=c*sum[mid-l]%mod;
a[rt<<|].hs=c*sum[r-mid-]%mod;
}
void build(int l,int r,int rt)
{
a[rt].l=l; a[rt].r=r;
a[rt].lazy=-;
if(l==r)
{
int x; scanf("%1d",&x);
a[rt].hs=x;
return;
}
int mid=(l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
up(l,r,rt);
}
void updata(int L,int R,int c,int rt)
{
int l=a[rt].l,r=a[rt].r;
if(l>=L && r<=R)
{
a[rt].lazy=c;
a[rt].hs=c*(sum[r-l])%mod;
return;
}
down(l,r,rt);
int mid=(l+r)>>;
if(L<=mid) updata(L,R,c,rt<<);
if(R>mid) updata(L,R,c,rt<<|);
up(l,r,rt);
}
ll query(int L,int R,int rt)
{
int l=a[rt].l,r=a[rt].r;
if(l>=L && r<=R)
return a[rt].hs;
down(l,r,rt);
int mid=(l+r)>>;
ll ans=;
int len=max(,min(R,r)-mid);
if(R>mid) ans=query(L,R,rt<<|);
if(L<=mid) ans=(ans+query(L,R,rt<<)*b[len])%mod;
return ans;
}
}seg;
bool check(int l,int r,int d)
{
if(r-l+<=d)
return true;
ll hs1=seg.query(l,r-d,);
ll hs2=seg.query(l+d,r,);
return hs1==hs2;
}
void init()
{
b[]=; sum[]=;
for(int i=;i<N;i++)
b[i]=b[i-]*base%mod;
for(int i=;i<N;i++)
sum[i]=(sum[i-]+b[i])%mod;
}
int main()
{
init();
read(n); read(m); read(k);
seg.build(,n,);
for(int i=;i<=m+k;i++)
{
int op,l,r;
read(op);
read(l); read(r);
if(op==)
{
int c; read(c);
seg.updata(l,r,c,);
}
else
{
int d; read(d);
if(check(l,r,d))
puts("YES");
else
puts("NO");
}
}
return ;
}

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

  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 Round #321 (Div. 2) D. Kefa and Dishes 状压dp

    题目链接: 题目 D. Kefa and Dishes time limit per test:2 seconds memory limit per test:256 megabytes 问题描述 W ...

  6. 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 ...

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

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

  8. Codeforces Round #321 (Div. 2) A. Kefa and First Steps【暴力/dp/最长不递减子序列】

    A. Kefa and First Steps time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  9. Codeforces Round #321 (Div. 2) E Kefa and Watch (线段树维护Hash)

    E. Kefa and Watch time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  10. Codeforces Round #321 (Div. 2)-A. Kefa and First Steps,暴力水过~~

    A. Kefa and First Steps time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

随机推荐

  1. 正方体旋转demo

    接着上一篇博客的内容顺藤摸瓜往下想,既然stage有景深这个概念,可以表达3D场景,那么这个stage就可以呈现立体几何咯,于是自己写了个Cubic Demo 一个正方体有6个面,我们把一个正方体平铺 ...

  2. POJ 2503 Babelfish (STL)

    题目链接 Description You have just moved from Waterloo to a big city. The people here speak an incompreh ...

  3. Nginx实战之让用户通过用户名密码认证访问web站点

    1.Nginx实战之让用户通过用户名密码认证访问web站点 [root@master ~]# vim /usr/local/nginx/conf/extra/www.conf server { lis ...

  4. Java垃圾回收机制复习

    一.如何确定某个对象是“垃圾” 二.典型的垃圾收集算法 三.典型的垃圾收集器 JVM(HotSpot) 7种垃圾收集器的特点及使用场景 https://www.cnblogs.com/chengxuy ...

  5. Kali2.0更新

    下载链接:猛戳这里 更新以后速度与界面友好性提高了! 界面仿造了ubuntu和fedora,应用也有很多小图标!这个对个人来说比较赞 安装以后的几件事 1.安装vmtools,方法跟1.0一样! ta ...

  6. 12章 搜索框架ElasticSearch介绍和整合SpringBoot 4节课

    1.搜索引擎知识和搜索框架elasticsearch基本介绍     简介:通过京东电商 介绍什么是搜索引擎,和开源搜索框架ElasticSearch6.x新特性介绍 前言:介绍ES的主要特点和使用场 ...

  7. 教你如何使用android studio发布release 版本【转】

    原文链接 想必还有人对如何在Android studio (以下简称as)发布release版本的app而狂刷百度吧?都是过来人,我很理解这种心情,百度到的基本是半成品,为什么这么说呢?百度一下,你就 ...

  8. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】

    转自:http://blog.chinaunix.net/uid-26349264-id-4455634.html 目录 kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 ...

  9. Oracle实体化视图

    1.减轻网络负担:通过MV将数据从一个数据库分发到多个不同的数据库上,通过对多个数据库访问来减轻对单个数据库的网络负担.  2.搭建分发环境:通过从一个中央数据库将数据分发到多个节点数据库,达到分发数 ...

  10. 安装最新版的2016版Pycharm后,激活码

    2016年安装Pycharm后,过段时间过期.亲测只需要复制以下激活码可以完美解决激活问题,又可以开心的写Python了.以下为激活码内容: BIG3CLIK6F-eyJsaWNlbnNlSWQiOi ...