E. Kefa and Watch hash 线段树
2015-09-28 14:11:36 by opas
这题给的是一个字符串 把其中一些子串给取出来 判断是否是周期为d的字符串 还需要把 其中的一个区间完全变成一个数 ,然后在查询,我们把每个字符串进行hash 不管结果怎么样hash 然后进行区区间判断 。。 还是存在概率性的错误的
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long LL;
const int maxn=;
const LL mod0 =;
const LL mod1 =;
LL powd[][maxn],digitpow[][][maxn];
void init()
{
powd[][]=powd[][]=;
for(LL i=; i<=; i++)
{
powd[][i]=( powd[][i-] * )%mod0;
powd[][i]=( powd[][i-] * )%mod1; for(int j=; j<; j++)
{
digitpow[][j][i]=( digitpow[][j][i-]*+j )%mod0;
digitpow[][j][i]=( digitpow[][j][i-]*+j )%mod1;
}
}
}
char str[maxn];
struct Itree
{
LL mark[maxn*],v[][maxn*],ans[];
int cL,cR,num;
void maintain(int L, int R, int o)
{
int mid=(L+R)>>;
v[][o]=( v[][o*] * powd[][R-mid] + v[][o*+] )%mod0;
v[][o]=( v[][o*] * powd[][R-mid] + v[][o*+] )%mod1;
}
void build(int L, int R, int o)
{
mark[o]=-;
if(L==R){
v[][o]=v[][o]=str[L-]-''; return ;
}
int mid=(L+R)>>;
build(L,mid,o*);
build(mid+,R,o*+);
maintain(L,R,o);
}
void qper(int L, int R,int n, LL &ans0,LL &ans1)
{
cL=L;cR=R; ans[]=ans[]=;num=;
query(,n,);
ans0=ans[]; ans1=ans[];
}
void pushdown(int L, int R, int o)
{
if(mark[o]!=-)
{
int mid=(L+R)>>;
mark[o*]=mark[o*+]=mark[o]; v[][o*]=digitpow[][mark[o]][ mid-L+ ];
v[][o*]=digitpow[][mark[o]][ mid-L+ ]; v[][o*+]=digitpow[][mark[o]][ R-mid ];
v[][o*+]=digitpow[][mark[o]][ R-mid ]; mark[o]=-;
}
}
void query(int L, int R, int o)
{
if(cL<=L&&R<=cR)
{
ans[]=(ans[]*powd[][R-L+]+v[][o])%mod0;
ans[]=(ans[]*powd[][R-L+]+v[][o])%mod1;
return ;
}
pushdown(L,R,o);
int mid=(L+R)>>;
if(cL<=mid)query(L,mid,o*);
if(cR>mid)query(mid+,R,o*+);
}
void update(int L, int R, int o)
{
if(cL<=L&&R<=cR)
{
mark[o]=num;
v[][o]=digitpow[][num][R-L+];
v[][o]=digitpow[][num][R-L+];
return ;
}
pushdown(L,R,o);
int mid=(L+R)>>;
if(cL<=mid)update(L,mid,o*);
if(cR>mid)update(mid+,R,o*+);
maintain(L,R,o);
}
}T;
int main()
{
init();
int n,m,k;
while(scanf("%d%d%d",&n,&m,&k)==)
{
scanf("%s",str);
T.build(,n,);
m+=k;
while(m--){
int op,L,R,V;
scanf("%d%d%d%d",&op,&L,&R,&V); if(op==){
T.cL=L;T.cR=R; T.num=V;
T.update(,n,);
}else{
if((R-L+)<=V){
puts("YES");
}else
if( ( R - L + ) <= * V )
{ int len=R-L+-V;
LL a10,a11,a20,a21;
T.qper(L,L+len-,n,a10,a11);
T.qper(R-len+,R,n,a20,a21);
if(a10==a20&&a11==a21) puts("YES");
else puts("NO"); }else
{
if((R-L+)%V == ){
int d=(R-L+)/V;
int len = (d-)*V;
LL a10,a11,a20,a21;
T.qper(L,L+len-,n,a10,a11);
T.qper(R-len+,R,n,a20,a21);
if(a10==a20&&a11==a21) puts("YES");
else puts("NO");
}
else{
int d=(R-L+)/V;
int len = (d-)*V;
int tail=(R-L+)-V*d;
LL a10,a11,a20,a21;
T.qper(L,L+len-,n,a10,a11);
T.qper(L+V,L+V+len-,n,a20,a21);
if(a10==a20&&a11==a21) {
T.qper(L,L+tail-,n,a10,a11);
T.qper(R-tail+,R,n,a20,a21);
if(a10==a20&&a11==a21)
puts("YES");
else puts("NO");
}
else puts("NO"); }
} } }
}
return ;
}
E. Kefa and Watch hash 线段树的更多相关文章
- bzoj2124 等差子序列(hash+线段树)
2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 719 Solved: 261[Submit][Status][Discuss] ...
- HDU - 3973 AC's String(Hash+线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=3973 题意 给一个词典和一个主串.有两种操作,查询主串某个区间,问这主串区间中包含多少词典中的词语.修改主串某一 ...
- 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】
一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...
- day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树
来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...
- URAL 1890 . Money out of Thin Air (dfs序hash + 线段树)
题目链接: URAL 1890 . Money out of Thin Air 题目描述: 给出一个公司里面上司和下级的附属关系,还有每一个人的工资,然后有两种询问: 1:employee x y z ...
- 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 ...
- 线段树---poj2528 Mayor’s posters【成段替换|离散化】
poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...
- 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 ...
- 线段树 + 字符串Hash - Codeforces 580E Kefa and Watch
Kefa and Watch Problem's Link Mean: 给你一个长度为n的字符串s,有两种操作: 1 L R C : 把s[l,r]全部变为c; 2 L R d : 询问s[l,r]是 ...
随机推荐
- Struts2验证框架_xml验证失败
测试Struts2验证框架-->XML验证 启动tomcat后网页登录失败 Employee-validation.xml文件头如下: <!DOCTYPE validators PUB ...
- Win10系统桌面右键新建没有内容怎么恢复
Win10系统桌面右键新建没有内容怎么恢复 添加txt文本文档 运行->regedit,打开注册表编辑器 展开HKEY_CLASSES_ROOT 找到.txt 选中.txt,修改右侧窗格的“默认 ...
- java上传文件代码
import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;impo ...
- oracle中实现当前月减少或增加N个月
add_months(last_day(trunc(sysdate)),N)N可以为正,表示增加:N可以为负,表示减少.
- webstorm 2017激活
选择“license server” 输入:http://idea.imsxm.com/
- docker+jenkins的构建历史记录(Build History)时间不正确
1.分别查看宿主机时间和容器时间 宿主机时间 root@fcaad17f146a:/# date Fri Jan :: CST 容器时间 [root@ ~]# docker exec -ti 8798 ...
- Python3学习之路~6.2 实例演示面向对象编程的好处
首先建一个dog类,实例化为3个dog对象,并让它们都叫. class Dog: def bulk(self): print("xiaohuang:wang wang wang !" ...
- python文件的md5加密方法
本文实例讲述了python文件的md5加密方法.分享给大家供大家参考,具体如下: 一.简单模式: from hashlib import md5 def md5_file(name): m = md5 ...
- git add 所有文件
git add 多个文件的格式介绍 git提交修改之前要add然后commit,假如我用git clone远程服务器文件到本地,然后我如果修改了其中几个文件要提交,我必须一个个的如: $git add ...
- 阿里云ECS利用密钥对ssh登录服务器
https://blog.csdn.net/u012865381/article/details/78521087/ 1.在服务机上操作创建要远程登录的用户和密码 [root@izwz97s23bov ...