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. PopupMenu动态创建菜单

    1.TPopupMenu一条横线在Caption输入一个'-'就可以了.2.在Caption输入名字之后加入一个&就可以不显示快捷键,比如: 退出&  这样退出按钮的快捷键就不会显示出 ...

  2. Python操作rabbitmq消息队列持久化

    消息队列持久化 Python操作rabbit消息队列的持久化,如下: # 创建一个名为balance的队列,对queue进行durable持久化设为True(持久化第一步)channel.queue_ ...

  3. mysql \c 终止 mysql输入语句模式

    \c 遇到这种情况怎么退出mysql 输入语句模式? mysql> select -> 输入\c退出 mysql> select -> \c mysql> 另外一种情况 ...

  4. Python3学习之路~2.7 文件操作

    对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 Somehow, it seems the love I knew was always the ...

  5. java -jstack

    一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...

  6. ionic 版本内更新问题汇总

    1.签名不一致导致的更新失败 2.解析软件包出现问题 3.当文件下载完.在android 8.0中不能打开apk包的问题 解决方案:在config.xml中添加: <platform name= ...

  7. Linux下samba服务搭建

    参考: https://www.cnblogs.com/lxyqwer/p/7271369.html https://www.cnblogs.com/liulipeng/p/3406352.html ...

  8. sublime使用经验汇总

    1. source insight 会对某个修改频繁的文件做多次备份.我们用sublime进行多个文件搜索时,需要把备份的文件排除在外. e:\work\code\sourcev, *.h, *.cp ...

  9. python datatype

    解释性语言,有类型的概念,没有类型的实体 所以,类型很重要 今天,我在这里练练python的类型 //test.py print int("10", 8) #8 scaleprin ...

  10. cocos2dx 3.x(游戏中的储存-UserDefault)

      引擎提供的UserDefault可以简单地储存游戏中的信息,例如背景音乐音效的开关状态,用户名等等. UserDefault是一个单例对象,可以用getInstance方法来获得. 如果是第一次调 ...