描述


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

给出一个长度为\(n\)的串,以及\(m\)个长度为\(k\)的串,求每个长度为\(k\)的串在原串\([x,y]\)区间是否出现过.

分析


这道题要求对比长度为\(k\)的串,于是我们把这些串的Hash值都算出来,问题就转化成了求\([x,y]\)的区间中是否出现过某Hash值.

求区间中某一个值出现了多少次,可以用主席树.

p.s.

1.学习了主席树指针的写法,比数组慢好多啊...看来有必要去学一学平衡树的数组写法...不过好处是不用自己算空间...

2.这道题自己算空间的话会MLE,所以卡着空间限制就好,估计数据比较小,可以过.

数组:

 #include <bits/stdc++.h>
using namespace std; const int maxn=+,X=;
typedef unsigned long long ull;
const ull INF=~0ull;
int n,m,k,cnt;
int a[maxn],rt[maxn];
ull s[maxn],x=;
struct node{ int l,r,s; }t[maxn*];
inline int read(int &x){ x=;int k=;char c;for(c=getchar();c<''||c>'';c=getchar())if(c=='-')k=-;for(;c>=''&&c<='';c=getchar())x=x*+c-'';return x*=k; }
void update(ull l,ull r,int &pos,ull d){
t[++cnt]=t[pos]; pos=cnt; t[pos].s++;
if(l==r) return;
ull mid=l+(r-l)/;
if(d<=mid) update(l,mid,t[pos].l,d);
else update(mid+,r,t[pos].r,d);
}
bool query(int x,int y,ull l,ull r,ull d){
if(t[y].s-t[x].s==) return false;
if(l==r) return true;
ull mid=l+(r-l)/;
if(d<=mid) return query(t[x].l,t[y].l,l,mid,d);
else return query(t[x].r,t[y].r,mid+,r,d);
}
int main(){
read(n); read(m); read(k);
for(int i=;i<=n;i++){
read(a[i]);
s[i]=s[i-]*X+(ull)a[i];
}
for(int i=;i<=k;i++) x*=X;
for(int i=k;i<=n;i++) rt[i]=rt[i-], update(0ull,INF,rt[i],s[i]-s[i-k]*x);
for(int i=;i<=m;i++){
ull hash=; bool ans;
int l,r; read(l); read(r);
for(int j=,t;j<=k;j++) hash=hash*X+read(t);
if(r+-l<k) ans=false;
else ans=query(rt[l+k-],rt[r],0ull,INF,hash);
ans?puts("No"):puts("Yes");
}
return ;
}

指针:

 #include <bits/stdc++.h>
using namespace std; const int maxn=+,X=;
typedef unsigned long long ull;
const ull INF=~0ull;
int n,m,k,cnt;
int a[maxn];
ull s[maxn],x=;
struct node{
node* l,* r; int s;
node(){}
node(node *l,node* r,int s):l(l),r(r),s(s){}
}* rt[maxn],* null;
inline int read(int &x){ x=;int k=;char c;for(c=getchar();c<''||c>'';c=getchar())if(c=='-')k=-;for(;c>=''&&c<='';c=getchar())x=x*+c-'';return x*=k; }
node* update(node* t,ull l,ull r,ull d){
if(l==r) return new node(null,null,t->s+);
ull mid=l+(r-l)/;
if(d<=mid) return new node(update(t->l,l,mid,d),t->r,t->s+);
else return new node(t->l,update(t->r,mid+,r,d),t->s+);
}
bool query(node* x,node* y,ull l,ull r,ull d){
if(y->s-x->s==) return false;
if(l==r) return true;
ull mid=l+(r-l)/;
if(d<=mid) return query(x->l,y->l,l,mid,d);
else return query(x->r,y->r,mid+,r,d);
}
int main(){
read(n); read(m); read(k);
null=new node;
null->l=null, null->r=null, null->s=;
for(int i=;i<=n;i++){
read(a[i]);
s[i]=s[i-]*X+(ull)a[i];
}
for(int i=;i<=k;i++) x*=X;
rt[k-]=new node(null,null,);
for(int i=k;i<=n;i++) rt[i]=update(rt[i-],0ull,INF,s[i]-s[i-k]*x);
for(int i=;i<=m;i++){
ull hash=; bool ans;
int l,r; read(l); read(r);
for(int j=,t;j<=k;j++) hash=hash*X+read(t);
if(r+-l<k) ans=false;
else ans=query(rt[l+k-],rt[r],0ull,INF,hash);
ans?puts("No"):puts("Yes");
}
return ;
}

BZOJ_3207_花神的嘲讽计划1_(Hash+主席树)的更多相关文章

  1. BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树

    BZOJ_3207_花神的嘲讽计划Ⅰ_哈希+主席树 Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程 ...

  2. BZOJ3207: 花神的嘲讽计划Ⅰ(hash)

    3207: 花神的嘲讽计划Ⅰ Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3569  Solved: 1258[Submit][Status][Di ...

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

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

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

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

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

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

  6. 【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树

    [BZOJ3207]花神的嘲讽计划Ⅰ Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快 ...

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

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

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

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

  9. 【BZOJ3207】花神的嘲讽计划I 可持久化线段树/莫队

    看到题目就可以想到hash 然后很自然的联想到可持久化权值线段树 WA:base取了偶数 这道题还可以用莫队做,比线段树快一些 可持久化线段树: #include<bits/stdc++.h&g ...

随机推荐

  1. JavaScript中关于创建对象的笔记

    1,最基本的两种创建对象的方式:构造函数|| 字面量 构造函数: var person = new Object(); person.name = "chen1zee1"; per ...

  2. Could not find action or result 导致 页面出现404错误

    注意一下语句的写法(在login.jsp中的action) 在  struts.xml中 <action name="login" class="action.Lo ...

  3. 九度OJ 1480 最大上升子序列和 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1480 题目描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列 ...

  4. 安装Apache Web 服务器软件

    Apache下载地址:http://pan.baidu.com/s/1kTKCEOn 1: 右击安装 2: 3: 4: 5:安装成功: 6:测试在浏览器地址栏输入:localhost; 会出现一个页面 ...

  5. 使用WebClient上传文件时的一些问题

    最近在使用WebClient做一个客户端上传图片到IIS虚拟目录的程序的时候,遇到了一些问题,这里主要给出参考步骤分享给大家. 测试环境 服务器端:Windows Server 2003,IIS6.0 ...

  6. centos 7.0 mono&Jexus V5.5.3安装

    首先我们需要先配置一下yum源中mono的引用说明: 第一步: vi /etc/yum.repos.d/mono.repo 第二步:在刚打开的文件中编辑如下内容 [mono]name=monobase ...

  7. 【转】c#文件操作大全(一)

    1.创建文件夹//using System.IO;Directory.CreateDirectory(%%1); 2.创建文件//using System.IO;File.Create(%%1); 3 ...

  8. iis7如何取消目录的可执行权限

    我们需要把IIs中某一个目录的可执行权限去掉.这在IIs6中是非常方便的,可是因为iis7的机制小编也找了不少资料才找到. 第一步:先选择需要取消权限的目录,然后在右边可以看到 “处理程序映射” 双击 ...

  9. C++ union 公共体

    union myun { struct { int x; int y; int z; }u; int k; }a; int main() { a.u.x =; a.u.y =; a.u.z =; a. ...

  10. Xilium.CefGlue利用XHR实现Js调用c#方法

    防外链 博客园原文地址在这里http://www.cnblogs.com/shen6041/p/3442499.html 引 Xilium CefGlue是个不错的cef扩展工程,托管地址在这里 ht ...