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 线段树的更多相关文章

  1. bzoj2124 等差子序列(hash+线段树)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 719  Solved: 261[Submit][Status][Discuss] ...

  2. HDU - 3973 AC's String(Hash+线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=3973 题意 给一个词典和一个主串.有两种操作,查询主串某个区间,问这主串区间中包含多少词典中的词语.修改主串某一 ...

  3. 【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】

    一开始看到题就果断跳到T2了!!没想到T2才是个大坑,浪费了两个小时QAQ!! 就是一道小模拟,它怎么说就怎么走就好了! 为什么要用这么多感叹号!!因为统计答案要边走边统计!!如果每个数据都扫一遍20 ...

  4. day 1 堆 hash 线段树 树状数组 冰茶姬 字典树 二叉查找树

    来郑州的第二天,早上开始也没说什么就说了些注意安全,各种各样的注意安全... 冰茶姬: 原来再打食物链时看了一下冰茶姬,只注意了路径压缩,没想到还有什么按秩排序但确实快了不少... int find( ...

  5. URAL 1890 . Money out of Thin Air (dfs序hash + 线段树)

    题目链接: URAL 1890 . Money out of Thin Air 题目描述: 给出一个公司里面上司和下级的附属关系,还有每一个人的工资,然后有两种询问: 1:employee x y z ...

  6. 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 ...

  7. 线段树---poj2528 Mayor’s posters【成段替换|离散化】

    poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...

  8. 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 ...

  9. 线段树 + 字符串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]是 ...

随机推荐

  1. 转:ActiveMQ的作用总结(应用场景及优势)

    原文地址: ActiveMQ的作用总结(应用场景及优势) 业务场景说明: 消息队列在大型电子商务类网站,如京东.淘宝.去哪儿等网站有着深入的应用, 队列的主要作用是消除高并发访问高峰,加快网站的响应速 ...

  2. kubernetes有状态集群服务部署与管理

    有状态集群服务的两个需求:一个是存储需求,另一个是集群需求.对存储需求,Kubernetes的解决方案是:Volume.Persistent Volume .对PV,除了手动创建PV池外,还可以通过S ...

  3. 使用Apache CXF根据wsdl文件生成代码

    1.去官网下载,我用的是apache-cxf-2.5.10.zip 2.解压 3.通过命令行进入Apache CXF的bin目录,如我的目录是D:\BIS\axis2\apache-cxf-2.7.1 ...

  4. nginx 负载均衡5种配置方式

    nginx 负载均衡5种配置方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比, ...

  5. CentOS安装HBase

    1.下载HBASE http://www.apache.org/dyn/closer.cgi/hbase/ 2.解压文件到安装目录 #mkdir hbase #cd hbase #tar -zxvf ...

  6. php获取数据库结构

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. oracle按照指定列排序操作

    按照...分组排序后,得到行编号: row_number() over(partition by ... order by ...) 按照...分组排序后,得到相应的列的第一个数据: first_va ...

  8. MySQL分支Percona

    MySQL分支Percona 转载自:http://www.cnblogs.com/cevin/archive/2012/05/12/2496859.html 官方网站:http://www.perc ...

  9. 004-linux命令-搜索命令find、locate、whereis、which、type

    一.概述 使用linux系统难免会忘记文件所在的位置,可以使用以下命令对系统中的文件进行搜索. 1.1.find 语法:find <指定目录> <指定条件> <指定动作& ...

  10. awesome vue

    https://blog.csdn.net/caijunfen/article/details/78216868