【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

在做之前需要了解一个知识点。
就是如果一个字符串s是一个a循环串。
(字符串的长度设为n,下标从1开始
那么s[1..n-a]和s[1+a..n]是相同的.
且这是充分必要条件。
可以看这篇文章 [链接](http://blog.sina.com.cn/s/blog_7981299401012xl0.html)
显然1..n-a就对应了文章中的**黄色部分**,而1+a..n对应了**蓝色部分**。
根据文章中的描述。显然如果这两部分相同。则它是长度为a的一个循环串。
(且**就算n不是a的倍数**,那种情况**也能用这种方法**判断

则我们的问题转化成快速判断某两段区间的字符串是否相同。

需要用到字符串hash的知识。

比如字符串

12343

它的hash值为\(1*base^0 + 2*base^1+3*base^2+4*base^3+3*base^4\)

显然如果太大了,这个值是会爆long long的。

但是没关系。

我们直接把它对一个数字MOD取模就好了。

这样我们就能用一个<MOD的数字唯一对应一段字符串了。

我们可以用线段树维护每一段字符串的hash值。

1操作就是线段树的成段更新。(预处理出\(base^{l-1}+base^l+base^{l+1}...base^{r}\)(前缀和),然后到了那段

区间直接让hash值等于c*(sum[r]-sum[l])就可以了。

2操作就是取出两段的区间的hash值,然后因为第一段是1..n-a,第二段是1+a..n,所以第二段整体的幂会比第一段多a,所以第一段的hash要再乘上base^a;

比较一下就好。

(据说卡1e9+7的模数

【代码】

#include <bits/stdc++.h>
#define ll long long
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std; const int N = 1e5+10;
const ll MOD = 1998000219;
const ll BASE = 12; ll _pow[N],_sum[N];
int n,m,k;
ll lazy_tag[N<<2],_hash[N<<2];
string s; ll _Get(int l,int r){
l--,r--;
if (l==0) return _sum[r];
else{
return (_sum[r]-_sum[l-1]+MOD)%MOD;
}
} void _pushdown(int rt,int l,int r){
if (lazy_tag[rt]==0) return; int mid = (l+r)>>1;
if (l!=r){
_hash[rt<<1] = 1LL*lazy_tag[rt]*_Get(l,mid)%MOD;
_hash[rt<<1|1] = 1LL*lazy_tag[rt]*_Get(mid+1,r)%MOD;
lazy_tag[rt<<1] = lazy_tag[rt<<1|1] = lazy_tag[rt];
}
lazy_tag[rt] = 0;
} void _modify(int num,int L,int R,int l,int r,int rt){
if (L<=l && r<=R){
_hash[rt] = 1LL*num*_Get(l,r)%MOD;
lazy_tag[rt] = num;
return;
}
_pushdown(rt,l,r);
int mid = (l+r)>>1;
if (L<=mid) _modify(num,L,R,lson);
if (mid<R) _modify(num,L,R,rson);
_hash[rt] = (_hash[rt<<1]+_hash[rt<<1|1])%MOD;
} ll _get(int L,int R,int l,int r,int rt){
if(L<=l && r<=R) return _hash[rt];
int mid = (l+r)>>1;
ll temp = 0;
_pushdown(rt,l,r);
if (L<=mid) temp = _get(L,R,lson);
if (mid<R) temp=(temp + _get(L,R,rson))%MOD;
return temp;
} int main()
{
ios::sync_with_stdio(0),cin.tie(0);
#ifdef LOCAL_DEFINE
freopen("rush.txt","r",stdin);
#endif cin >> n >> m >> k;
m+=k;
cin >> s; _pow[0] = 1;
_sum[0] = 1;
for (int j = 1;j <=n;j++){
_pow[j] = _pow[j-1]*BASE%MOD;
_sum[j] = (_sum[j-1]+_pow[j])%MOD;
} for (int i = 0;i <n;i++){
_modify(s[i]-'0'+1,i+1,i+1,1,n,1);
} while (m--){
int ope,l,r,num;
cin >>ope>>l>>r>>num;
if (ope==1){
_modify(num+1,l,r,1,n,1);
}else{
if ((r-l+1)==num || _get(l,r-num,1,n,1)*_pow[num]%MOD==
_get(l+num,r,1,n,1))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
} return 0;
}

【Henu ACM Round#14 E】Kefa and Watch的更多相关文章

  1. 【Henu ACM Round#14 D】Kefa and Dishes

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 状态压缩动规. 可以写成记忆化搜索的形式. f[bit][p] 表示选取的菜的情况为bit(用0..2^(N)-1的二进制形式表示各 ...

  2. 【Henu ACM Round#14 F】 President and Roads

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到 ...

  3. 【Henu ACM Round#14 C】Duff and Weight Lifting

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 2^y可以由两个2^(y-1)相加得到. 则有一个贪心的策略. 就是2^x尽量都变成2^(x+1) (即能够凑就尽量凑) 如果x还有 ...

  4. 【Henu ACM Round#14 B】Duff in Love

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 让你在n的因子里面找一个最大的数字x 且x的因子全都不是完全平方数(y^2,y>1) O(sqrt(n))找出n的所有因子. ...

  5. 【Henu ACM Round#14 A】Vitaly and Night

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 连续两个如果不全是0就递增cnt [代码] #include <bits/stdc++.h> using namespa ...

  6. 【Henu ACM Round#24 E】Connected Components

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 要求把连续的一段li..ri的边全都删掉. 然后求剩下的图的联通数 如果暴力的话 复杂度显然是O(k*m)级别的. 考虑我们把li. ...

  7. 【Henu ACM Round#24 D】Iterated Linear Function

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一 ...

  8. 【Henu ACM Round#24 C】Quiz

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 肯定是这样 先放k-1个,然后空1个,然后再放k-1个.然后再空1个.. 以此类推. 然后如果(n/k)*(k-1)+n%k> ...

  9. 【Henu ACM Round#24 B】Gargari and Bishops

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果写过n皇后问题. 肯定都知道 某个点(i,j)和它在同一条对角线上的点分别是i+j的值和i-j的值相同的点. 然后会发现选择的两 ...

随机推荐

  1. android openGL ES2 一切从绘制纹理開始

    纹理.在openGL中,能够理解为载入到显卡显存中的图片.Android设备在2.2開始支持openGL ES2.0.从前都是ES1.0 和 ES1.1的版本号.简单来说,openGL ES是为了嵌入 ...

  2. DNS RR代码和含义

    记录类型 代码 号码 定义的 RFC 描述 功能 A 1 RFC 1035 IP 地址记录 传回一个 32 比特的 IPv4 地址,最常用于映射主机名称到 IP地址,但也用于DNSBL(RFC 110 ...

  3. shell加法运算及i++

    shell中不支持像普通c语言中的i++操作,默认都是字符串操作,但是通过以下几种方式可以进行变量的自增加 1.linux 用let 表示算术表达式 如下: i=0 let i +=1  或者 let ...

  4. Java基础学习(六)-- 递归以及文件I/O流基础详解

    递归 1.递归的概念: 在函数自身内部,调用函数本身的方式,称为递归. 2.递归的注意事项:包括递进去,归出来两步.   即:首先依次执行[函数调自身语句]上半部分的代码,知道最里层.(递进去),然后 ...

  5. 日前加拿大平板厂商 Datawind和印度运营商Reliance Communications日前宣布合作

    全球最便宜智能手机只要15美元 随着手机进入智能时代,这些年智能手机的发展可谓迅猛,苹果三星这样的手机厂商成为最大的受益者同时,低门槛也让越来越多的人开始意识到,全民智能时代确实要来了. 为了能让第三 ...

  6. 一个icon的选中与不选中

    页面的样式展示 1.页面中选中的状态 2.页面中未选中的状态 3.俩个icon代表的状态 页面的布局展示 <label> <i class="iconfont icon-d ...

  7. maven+spring-data-jpa环境搭建

    转自http://www.cnblogs.com/007sx/p/5658194.html 首先看一下项目结构: 所用到的jar(pom.xml): <project xmlns="h ...

  8. 对比学习:《深度学习之Pytorch》《PyTorch深度学习实战》+代码

    PyTorch是一个基于Python的深度学习平台,该平台简单易用上手快,从计算机视觉.自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的Allen N ...

  9. Unity C# 设计模式(三)工厂方法模式

    定义: 定义一个创建对象的接口(父类),由子类决定需要实例化哪一个类. 这样,核心工厂类成为了一个抽象角色,不再负责产品的创建,仅提供具体工厂类所必须实现的接口,这样进一步抽象化的好处是使得工厂方法模 ...

  10. Select For update语句浅析

    Select -forupdate语句是我们经常使用手工加锁语句.通常情况下,select语句是不会对数据加锁,妨碍影响其他的DML和DDL操作.同时,在多版本一致读机制的支持下,select语句也不 ...