【题目链接】

http://www.lydsy.com/JudgeOnline/problem.php?id=3207

【题意】

给定一个文本串,多次询问K长的模式串是否在文本[l,r]区间内出现。

【思路】

对文本串每K个长度进行一次hash。

主席树维护val表示一个hash值 的出现次数。查询只需要找到对应的两棵主席树然后计算val的差值即可。

【代码】

 #include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef unsigned long long ll;
const int N = 2e5+; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} struct Tnode {
Tnode *ls,*rs;
int val;
} *T[N],mempool[N*],*G=mempool;
Tnode * Nw (Tnode*l,Tnode*r,int x) {
G->ls=l,G->rs=r,G->val=x;
return G++;
} Tnode* build(Tnode* p,ll l,ll r,ll pos) {
if(l==r) return Nw (0x0,0x0,p->val+);
else {
ll mid=l+((r-l)>>);
if(pos<=mid) return Nw (build(p->ls,l,mid,pos),p->rs,p->val);
else return Nw (p->ls,build(p->rs,mid+,r,pos),p->val);
}
}
int query(Tnode*x,Tnode*y,ll l,ll r,ll pos) {
if(l==r) return y->val - x->val;
else {
ll mid=l+((r-l)>>);
if(pos<=mid) return query(x->ls,y->ls,l,mid,pos);
else return query(x->rs,y->rs,mid+,r,pos);
}
} int n,m,K,a;
ll H[N],xp=,X=; int main()
{
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
n=read(),m=read(),K=read();
FOR(i,,n) {
a=read();
H[i]=H[i-]*X+a;
}
FOR(i,,K) xp*=X;
int l,r; T[K-]=Nw (G,G,);
FOR(i,K,n)
T[i]=build(T[i-],0ull,18446744073709551615ull,H[i]-H[i-K]*xp);
FOR(i,,m) {
l=read(),r=read();
ll H=;
FOR(j,,K) {
a=read();
H=H*X+a;
}
if(r-l+<K) { puts("Yes"); continue; }
if(query(T[l+K-],T[r],0ull,18446744073709551615ull,H) > ) puts("No");
else puts("Yes");
}
return ;
}

P.S.原来hash函数写的丑也是会WA的 TAT

bzoj 3207 花神的嘲讽计划Ⅰ(哈希法+主席树)的更多相关文章

  1. BZOJ 3207 花神的嘲讽计划Ⅰ(函数式线段树)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3207 题意:给出一个数列,若干询问.每个询问查询[L,R]区间内是否存在某个长度为K的子 ...

  2. BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )

    O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...

  3. bzoj 3207 花神的嘲讽计划Ⅰ 主席树+hash

    花神的嘲讽计划Ⅰ Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3112  Solved: 1086[Submit][Status][Discuss] ...

  4. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】

    题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...

  5. bzoj 3207: 花神的嘲讽计划Ⅰ

    Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: "哎你傻不傻的![hqz:大笨J]" "这道题又被J屎过了!!" "J这程序 ...

  6. BZOJ_3207_花神的嘲讽计划1_(Hash+主席树)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=3207 给出一个长度为\(n\)的串,以及\(m\)个长度为\(k\)的串,求每个长度为\(k\ ...

  7. BZOJ 3207: 花神的嘲讽计划Ⅰ(莫队+哈希)

    传送门 解题思路 刚开始写了个莫队+哈希+\(map\)的\(O(n\sqrt(n)log(n)\)的辣鸡做法,\(T\)飞了.后来看了看别人博客发现其实并不用拿\(map\)当桶存那些哈希值.因为只 ...

  8. [bzoj3207]花神的嘲讽计划Ⅰ[可持久化线段树,hash]

    将每k个数字求一个哈希值,存入可持久化线段树,直接查询即可 #include <iostream> #include <algorithm> #include <cstd ...

  9. 【BZOJ】【3207】花神的嘲讽计划 I

    字符串Hash+可持久化线段树 好神奇的转化…… 蒟蒻一开始还去想AC自动机去了……然而由于a[i]的范围是小于等于n,怎么也想不出一个时间复杂度合理的方法 膜拜了题解0.0原来是字符串Hash! 首 ...

随机推荐

  1. 10 harsh truths that will help you grow

    10 harsh truths that will help you grow帮你成长的10个残酷事实In the game of life, if it often seems like you’r ...

  2. 自己常用的wireshark过滤条件

    抓发给NVR的StrartRealPlay命令包: ip.src eq 118.123.114.8 and  tcp contains 02:63:64:61 抓发给NVR的心跳包: ip.src e ...

  3. C#实现字符串按多个字符采用Split方法分割

    原文:C#实现字符串按多个字符采用Split方法分割 String字符串如何按多个字符采用Split方法进行分割呢?本文提供VS2005和VS2003的实现方法,VS2005可以用下面的方法: str ...

  4. *windows下安装以及配置nginx

    1.从nginx官网下载相应的安装包. http://nginx.org/

  5. EINTR错误

    慢系统调用(slow system call):此术语适用于那些可能永远阻塞的系统调用.永远阻塞的系统调用是指调用有可能永远无法返回,多数网络支持函数都属于这一类.如:若没有客户连接到服务器上,那么服 ...

  6. java导出excel报表

    1.java导出excel报表: package cn.jcenterhome.util; import java.io.OutputStream;import java.util.List;impo ...

  7. Java IO 遇到的错误

    1.java.io.FileNotFoundException: /storage/emulated/0/xxx.txt: open failed: EISDIR (Is a directory) 该 ...

  8. C++STL之整理算法

    这里主要介绍颠倒.旋转.随机排列和分类4中常见的整理算法 1.颠倒(反转) void reverse(_BidIt _First, _BidIt _Last) _OutIt reverse_copy( ...

  9. Parallel WebDriver executions using TestNG

    In this post, we will see how does one make use of TestNG to kick off parallel UI tests using WebDri ...

  10. Qt之自定义界面(QMessageBox)

    简述 通过前几节的自定义窗体的学习,我们可以很容易的写出一套属于自己风格的界面框架,通用于各种窗体,比如:QWidget.QDialog.QMainWindow. 大多数窗体的实现都是采用控件堆积来完 ...