【bzoj3207】花神的嘲讽计划Ⅰ hash

709人阅读 评论(0) 收藏 举报
分类:

直接hash就好了,每次查询hash表里有没有在这个区间里的就可以,貌似并不用主席树。


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#define maxn 200010
#define mod 1000007

using namespace std;

int hash1[maxn];
unsigned long long hash2[maxn];
int a[maxn];
int b[maxn];
int p1[maxn];
unsigned long long p2[maxn];
int n,T,k;
vector<pair<unsigned long long,int> > v[mod];
int hash;
unsigned long long Hash;

bool check(int l,int r)
{
	for (int i=0;i<v[hash].size();i++)
	  if (v[hash][i].first==Hash && v[hash][i].second>=l && v[hash][i].second+k-1<=r) return 1;
	return 0;
}

int calc1(int l,int r)
{
	return ((long long)hash1[r]-(long long)hash1[l-1]*p1[r-l+1]%mod+mod)%mod;
}

unsigned long long calc2(int l,int r)
{
	return hash2[r]-hash2[l-1]*p2[r-l+1];
}

int main()
{
	scanf("%d%d%d",&n,&T,&k);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	p1[0]=1;p2[0]=1;
	for (int i=1;i<=n;i++) p1[i]=((long long)p1[i-1]*233333)%mod,p2[i]=p2[i-1]*10000007;
	for (int i=1;i<=n;i++) hash1[i]=((long long)hash1[i-1]*233333+a[i])%mod,hash2[i]=hash2[i-1]*10000007+a[i];
	for (int i=1;i+k-1<=n;i++) v[calc1(i,i+k-1)].push_back(make_pair(calc2(i,i+k-1),i));
	while (T--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		for (int j=1;j<=k;j++) scanf("%d",&b[j]);
		hash=0,Hash=0;
		for (int j=1;j<=k;j++) hash=((long long)hash*233333+b[j])%mod,Hash=Hash*10000007+b[j];
		if (check(l,r)) printf("No\n");
		else printf("Yes\n");
	}
	return 0;
}


查看评论

bzoj3207

#include #include #include #include #include #include #include using namespace std; int d[20...
  • ZXsmyz66666
  • ZXsmyz66666
  • 2016-02-10 14:04:24
  • 90

Bzoj3207:花神的嘲讽计划Ⅰ&&Bzoj2653:middle

可持久化线段树的好题啊QAQ
  • qq_34025203
  • qq_34025203
  • 2016-03-22 15:32:09
  • 236

[BZOJ3207]花神的嘲讽计划Ⅰ(hash+可持久化线段树)

题目描述传送门题解把长度为k的子串hash起来然后离散化 建立可持久化权值线段树,每一次在一段区间上查询即可代码#include #include #include #include #includ...
  • Clove_unique
  • Clove_unique
  • 2017-01-02 20:43:48
  • 424

BZOJ 3207 花神的嘲讽计划I Hash+可持久化线段树/划分树

题目大意:给定一个数字串,多次求某个区间内有没有一个长度为k的子串 首先对字符串进行哈希 然后问题就转化成了求一个区间内有没有某个数 可持久化线段树即可 其实我觉得划分树会更快一些 可以写写 ※注...
  • PoPoQQQ
  • PoPoQQQ
  • 2014-10-19 14:55:25
  • 1751

bzoj-3207 花神的嘲讽计划Ⅰ

题意: 给出一个长度为n的序列,有m个询问; 每次给出一个区间[l,r]和一个长度为K的短序列; 查询区间中是否存在这个子串; 1 题中所有数据不超过2*10^9;保证方案序列的每个数字 题解: ...
  • ww140142
  • ww140142
  • 2015-09-30 21:00:02
  • 718

【BZOJ3207】花神的嘲讽计划Ⅰ hash+可持久化线段树

题解: 首先因为嘲讽长度固定,所以我们可以给每个点固定一个hash值(不固定的话我还真不会做)。 然后用可持久化线段树实现一段区间内有哪些数,然后查询一段区间是否有要的那个数就行了。 代码: ...
  • Vmurder
  • Vmurder
  • 2015-05-13 08:13:06
  • 1194

可持久化线段树HDU2665、bzoj3207

http://acm.hdu.edu.cn/showproblem.php?pid=2665 HDU2665..求区间K小。。可以用化分树、各种树来做。也可以用持久化线段树写。 代码: #inc...
  • u012915516
  • u012915516
  • 2015-08-15 16:00:37
  • 556

bzoj 3207 花神的嘲讽计划Ⅰ 主席树

Hash 一下就好。。模板题。。注意Unsigned long long加爆的问题 ms 这题卡Unsigned int.. #include #include #include #include...
  • zzzzzfy
  • zzzzzfy
  • 2016-04-18 19:30:55
  • 548

BZOJ 3207 花神的嘲讽计划Ⅰ主席树+Hash

BZOJ 3207 花神的嘲讽计划Ⅰ主席树+Hash
  • wzq_QwQ
  • wzq_QwQ
  • 2015-09-29 17:21:35
  • 673

BZOJ3207: 花神的嘲讽计划Ⅰ

最近不是很想写blog,但是不写的话很快就连自己做过什么都不记得了吧题意:一个序列,每次询问一段区间里含不含一个长度为K的子串,K的长度固定长度固定的话直接hash就好了呀,然后就变成问一段区间有没有...
  • L_0_Forever_LF
  • L_0_Forever_LF
  • 2016-11-13 16:10:36
  • 606
    个人资料
    持之以恒
    等级:
    访问量: 20万+
    积分: 5055
    排名: 6911
    最新评论