题目大意:给你一个由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. linux4.10.8 内核移植(三)---裁剪内核

    一.裁剪内核 1.1 第一次修改 现在的内核大小为2.8M左右,要裁剪到2.0M以下,毕竟给内核分区就只有2.0M. 这两个设备我们没有,裁剪掉. 进入make menuconfig中,搜索mouse ...

  2. Centos7编译hadoop异常:Received fatal alert: handshake_failure

    保持网络畅通 或者 配置代理 能够访问cdh的仓库 https://repository.cloudera.com/artifactory/cloudera-repos/ 编译hadoop版本 had ...

  3. Native、Web App、Hybrid、React Native(简称RN)、Weex 间的异同点。

    App常用开发模式简介 此处App为应用application,并非我们通常讲的手机App. 常用的几种APP开发模式-脑图 Native App 传统的原生App开发模式,有iOS和aOS两大系统, ...

  4. 关于Linux 虚拟机如何才能ping 通外网

    需要虚拟机能够联网.以前都是用桥接模式让虚拟机跟主机通信,这几天查了好多资料,都没有写得很详细,自己捣鼓了很久,把步骤写下来吧. 虚拟机操作步骤: 点击虚拟机的“菜单栏”上的“编辑”,再点击“虚拟网络 ...

  5. Django学习手册 - 模板语言(前端获取后台数据)

    先在views视图内,定义列表数据,以及字典数据.运用render函数传递两个列表数据至前端. from django.shortcuts import render list_info = [ {& ...

  6. iOS视频流开发(2)—视频播放

    承上篇,本篇文章主要介绍iOS视频播放需要用到的类.以及他们的使用场景和开发中遇到的问题. MPMoviePlayerViewController MP简介 iOS提供MPMoviePlayerCon ...

  7. SpringBoot使用thymeleaf模板引擎

    (1).添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...

  8. C#基础系列-反射

    1.反射的定义 反射(Reflection),是.Net中获取运行时类型信息的方式.程序集中有关程序及其类型的数据被称为元数据(metadata).程序在运行时,可以查看其它程序集或其本身的元数据.一 ...

  9. freeRTOS中文实用教程6--错误排查

    1.前言 本章主要是为刚接触FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出侦测上 2.printf-stdarg.c 当调用标准C 库函数时,栈空间使用 ...

  10. Nodejs+定时截图+发送邮件

    功能 每天定时截图,并把截到的图片自动通过邮件发送. 说明 代码注释已经非常详细,就不多做说明,需要的朋友自己查看代码即可,主文件Mail.js,截图文件capturePart1.js,capture ...