原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1553.html

题目传送门 - 51Nod1553

题意

  有一个串只包含数字字符。串的长度为n,下标从1开始。

  有两种操作方式:

  1 l r c (1≤l≤r≤n, c是数字字符),表示将l到r这一段的字符全部改成c字符;

  2 l r d (1≤l≤r≤n, 1≤d≤r-l+1),表示询问l到r这一段区间内的子串是否是以d为周期的串。

  字符串s是以x (1≤x≤|s|),为周期的串的条件是:对于所有的 i从1到|s|-x, $s_i = s_{i + x}$ 都成立。

  $n\leq 10^5$ ,操作总数 $\leq 2\times 10^5$ 。

题解

  只要 $s[l\cdots r-d] = s[l+d\cdots r]$ 那么就是周期串。

  直接线段树维护哈希值就好了。

代码

#include <bits/stdc++.h>
using namespace std;
int read(){
int x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
const int N=100005;
int n,m;
int a[N];
struct HashSeg{
int mod,P,Pow[N],sp[N];
int t[N<<2],sz[N<<2],add[N<<2];
void build(int rt,int L,int R){
sz[rt]=R-L+1,add[rt]=-1;
if (L==R){
t[rt]=a[L];
return;
}
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
build(ls,L,mid);
build(rs,mid+1,R);
t[rt]=(1LL*t[ls]*Pow[sz[rs]]+t[rs])%mod;
}
void init(int _mod,int _P){
mod=_mod,P=_P;
Pow[0]=1;
for (int i=1;i<=n;i++)
Pow[i]=1LL*Pow[i-1]*P%mod;
sp[0]=0;
for (int i=1;i<=n;i++)
sp[i]=(sp[i-1]+Pow[i-1])%mod;
build(1,1,n);
}
void cover(int rt,int d){
t[rt]=1LL*d*sp[sz[rt]]%mod;
add[rt]=d;
}
void pushdown(int rt){
int &v=add[rt];
if (!~v)
return;
cover(rt<<1,v);
cover(rt<<1|1,v);
v=-1;
}
void update(int rt,int L,int R,int xL,int xR,int d){
if (R<xL||L>xR)
return;
if (xL<=L&&R<=xR)
return cover(rt,d);
pushdown(rt);
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
update(ls,L,mid,xL,xR,d);
update(rs,mid+1,R,xL,xR,d);
t[rt]=(1LL*t[ls]*Pow[sz[rs]]+t[rs])%mod;
}
int query(int rt,int L,int R,int xL,int xR){
if (R<xL||L>xR)
return 0;
if (xL<=L&&R<=xR)
return 1LL*t[rt]*Pow[xR-R]%mod;
pushdown(rt);
int mid=(L+R)>>1,ls=rt<<1,rs=ls|1;
return (query(ls,L,mid,xL,xR)+query(rs,mid+1,R,xL,xR))%mod;
}
}T0,T1;
int main(){
n=read(),m=read()+read();
for (int i=1;i<=n;i++)
scanf("%1d",&a[i]);
T0.init(998244353,233);
T1.init(1e9+7,101);
while (m--){
int opt=read(),L=read(),R=read(),d=read();
if (opt==1){
T0.update(1,1,n,L,R,d);
T1.update(1,1,n,L,R,d);
}
else {
if (R-L+1<=d)
puts("YES");
else if (T0.query(1,1,n,L,R-d)==T0.query(1,1,n,L+d,R))
&&T1.query(1,1,n,L,R-d)==T1.query(1,1,n,L+d,R))
puts("YES");
else
puts("NO");
}
}
return 0;
}

  

51Nod1553 周期串查询 字符串 哈希 线段树的更多相关文章

  1. N - Subpalindromes URAL - 1989 哈希+线段树

    N - Subpalindromes URAL - 1989 这个是一个哈希+线段树,这个题目也不算特别难,但是呢,还比较有意思. 这个题目给你两个操作,一个是回答l~r 区间是不是回文,一个是对一个 ...

  2. 洛谷P4493 [HAOI2018]字串覆盖(后缀自动机+线段树+倍增)

    题面 传送门 题解 字符串就硬是要和数据结构结合在一起么--\(loj\)上\(rk1\)好像码了\(10k\)的样子-- 我们设\(L=r-l+1\) 首先可以发现对于\(T\)串一定是从左到右,能 ...

  3. 美团CodeM初赛B轮 合并字符串的价值 (线段树,分类讨论)

    输入两个字符串a和b,合并成一个串c,属于a或b的字符在c中顺序保持不变.如"ACG"和"UT"可以被组合成"AUCTG"或"AC ...

  4. Hihocoder #1077 : RMQ问题再临-线段树(线段树:结构体建树+更新叶子往上+查询+巧妙使用father[]+线段树数组要开大4倍 *【模板】)

    #1077 : RMQ问题再临-线段树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到:小Hi给小Ho出了这样一道问题:假设整个货架上从左到右摆放了N种商品,并 ...

  5. POJ 3264:Balanced Lineup(区间最值查询ST表&线段树)

      Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 75294   Accepted: 344 ...

  6. [bzoj3207][花神的嘲讽计划Ⅰ] (字符串哈希+主席树)

    Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天D ...

  7. 【BZOJ3110】K大数查询(权值线段树套线段树+标记永久化,整体二分)

    题意:有N个位置,M个操作.操作有两种,每次操作 如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  8. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  9. 线段树&&线段树的创建线段树的查询&&单节点更新&&区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

随机推荐

  1. UVA 11796

    题意:  有两个狗, 按照 多边形跑,不知道两条狗的速度,但是狗是同时出发,同时到达终点的 输出两条狗的 最大相距距离 - 最小相距距离: 思路 : 用物理的相对运动来计算, 每次只计算 两条狗的直线 ...

  2. [C]gcc编译器的一些常用语法

    简单的GCC语法: 如果你只有一个文件(或者只有几个文件),那么就可以不写Makefile文件(当然有Makefile更加方便),用gcc直接编译就行了.在这里我们只介绍几个我经常用的几个参数,第一是 ...

  3. [HTTP]HTTP 中的 Transfer-Encoding 报文头

    一.背景: 持续连接的问题:对于非持续连接,浏览器可以通过连接是否关闭来界定请求或响应实体的边界:而对于持续连接,这种方法显然不奏效.有时,尽管我已经发送完所有数据,但浏览器并不知道这一点,它无法得知 ...

  4. JS访问SpringMVC后台

    var actions=ctx.path + "/api/stat/exportScheStatInfo.json"; var form = $("<form> ...

  5. Confluence 6 用户目录图例 - 连接 Jira 和 Jira 连接 LDAP

    上面的图: Confluence 连接到 JIRA 用户管理,JIRA 使用 LDAP 用户目录. https://www.cwiki.us/display/CONFLUENCEWIKI/Diagra ...

  6. 修改MongoDB密码

    修改MongoDB密码 禁用管理员(root)密码 1.找到配置文件mongod.conf,并进入 vim /etc/mongod.conf 2.禁用管理员(root)密码 找到: security: ...

  7. linux之cp命令(转载)

    Linux中使用cp命令复制文件(夹),本文就日常工作中常用的cp命令整理如下. 一.复制一个源文件到目标文件(夹). 命令格式为:cp 源文件 目标文件(夹) 这个是使用频率最多的命令,负责把一个源 ...

  8. 编辑技巧之如何跟PDF文档添加贝茨编号

    除了office办公软件,pdf文档现在使用的频率也便多了,不论是工作或是学习,阅读都用阅读器打开就行了,可是如果想要修改.编辑那只用阅读器是无法进行编辑的,其实PDF文件的编辑还是很方便,使用PDF ...

  9. react 使用draft.js富文本编辑器

    参照网址:https://www.cnblogs.com/3body/p/6224010.html 参看网址:https://www.cnblogs.com/mosquito18/p/9787816. ...

  10. hdu2121 最小树形图的虚根

    /* 最小树形图的第二题,终于有了一些理解 具体看注释 */ /* 无定根的最小树形图 建立虚root 每次只找最短的那条入边 最小树形图理解: 第一步:寻找最短弧集E:扫一遍所有的边,找到每个点权值 ...