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]是 ...
随机推荐
- # 20165225 《Java程序设计》第一周学习总结
20165225 <Java程序设计>第一周学习总结 1.视频与课本中的学习: 首先是为了运行和开发Java分别安装了JRE和JDK,具体做法在老师给的<Java2 实用教程(第五版 ...
- Win7 开机自动启动Outlook2010
工作中,设置一些开机启动项,可以提供工作效率,下面演示设置Outlook2010在win7系统开机自启动,其它软件,如Eclipse.微信等,也可以这么配置. 环境: win7,outlook 201 ...
- ubuntu上编译linux内核
Linux 编译:1,首先解压缩内核.2,make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- digilent_z ...
- wps去广告
彻底解决WPS弹出热点广告.WPS购物图标的办法 方法一:(一定有效) https://www.cnblogs.com/ytaozhao/p/5654149.html 一直用WPS,但一直有一个问题迟 ...
- 前端 HTML 常用标签 head标签相关内容 link标签
link标签 引入CSS样式文件 href="./index.css" CSS文件的路径 <!-- 引入CSS样式文件 --> <link rel="s ...
- MySQL的nnodb引擎表数据分区存储
Symlinks are fully supported only for MyISAM tables. 对应Innodb引擎数据文件放到其他目录 mysql> SHOW VARIABLES L ...
- 并发编程---Process对象的其他属性或方法
Process对象的其他属性或方法 #join方法 from multiprocessing import Process import time,os ''' 需求:让主进程等着子进程运行完毕,才能 ...
- 对Python源码加密及反编译前后对比
关于python的加密 目前软件开发商对 Python 加密时可能会有两种形式,一种是对python转成的exe进行 保护,另一种是直接对.py或者.pyc文件进行保护,下面将列举两种形式的保护流程. ...
- jquery 无缝轮播
新闻公告无缝轮播--demo 理解:向上移动一个li的高度+margin-bottom值,同时将ul第一个的li插入到ul的最后一个位置. <!DOCTYPE html> <html ...
- Openvpn配置文件详解
一.vars配置文件 vars配置文件的主要内容如下: cat vars |grep -vE "^#|^$" KEY_DIR定义key生成的目录. KEY_SIZE定义生成私钥的大 ...