题目链接:BZOJ - 3207

题目分析

先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x 。

这一步可以使用可持久化线段树来做,虽然感觉可以有更简单的做法,但是我没有什么想法...

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>using namespace std;const int MaxN = 200000 + 5, P = 233, Mod = 3371723, MaxNode = 8000000 + 5; int n, m, k, en, TL_Index, Node_Index;
int A[MaxN], B[MaxN], Root[MaxN], Lc[MaxNode], Rc[MaxNode], T[MaxNode];struct HashNode
{int Pos, TL;HashNode *Next;
} H[MaxN], *Ph = H, *Hash[Mod + 5];bool Cmp(int *AA, int x, int *AB, int y) {for (int i = 0; i < k; ++i) if (AA[x + i] != AB[y + i]) return false;return true;
}void Insert(int &Now, int Last, int s, int t, int x) {if (Now == 0) Now = ++Node_Index;if (s == t) {T[Now] = T[Last] + 1;return;}int m = (s + t) >> 1;if (x <= m) {Rc[Now] = Rc[Last];Insert(Lc[Now], Lc[Last], s, m, x);}else {Lc[Now] = Lc[Last];Insert(Rc[Now], Rc[Last], m + 1, t, x);}
}int main()
{scanf("%d%d%d", &n, &m, &k);for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);en = n - k + 1;int HN, TL_i;HashNode *Now;TL_Index = 0;Node_Index = 0;for (int i = 1; i <= en; ++i) { HN = 0;for (int j = i; j < i + k; ++j) {HN = HN * P + A[j];if (HN > Mod) HN %= Mod;}Now = Hash[HN];TL_i = 0;while (Now != NULL) {if (Cmp(A, i, A, Now -> Pos)) {TL_i = Now -> TL;break;}Now = Now -> Next;}if (TL_i == 0) {++Ph; Ph -> Pos = i;Ph -> TL = TL_i = ++TL_Index;Ph -> Next = Hash[HN]; Hash[HN] = Ph;}Insert(Root[i], Root[i - 1], 1, n, TL_i);}int l, r, s, t, mid, x, y;for (int i = 1; i <= m; ++i) {scanf("%d%d", &l, &r);for (int j = 1; j <= k; ++j) scanf("%d", &B[j]);HN = 0;for (int j = 1; j <= k; ++j) {HN = HN * P + B[j];if (HN > Mod) HN %= Mod;}TL_i = 0;Now = Hash[HN];while (Now != NULL) {if (Cmp(B, 1, A, Now -> Pos)) {TL_i = Now -> TL;break;}Now = Now -> Next;}if (TL_i == 0 || r - l + 1 < k) printf("Yes\n");else {r = r - k + 1;x = Root[l - 1]; y = Root[r];s = 1; t = n;while (s != t) {mid = (s + t) >> 1;if (TL_i <= mid) {x = Lc[x]; y = Lc[y];t = mid;}else {x = Rc[x]; y = Rc[y];s = mid + 1;}}if (T[y] - T[x] > 0) printf("No\n");else printf("Yes\n");}}return 0;
}

  

转载于:https://www.cnblogs.com/JoeFan/p/4251833.html

[BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】相关推荐

  1. BZOJ 3207: 花神的嘲讽计划Ⅰ

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

  2. BZOJ 4408: [Fjoi 2016]神秘数(可持久化线段树)

    题目描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4408 题目大意:求最小不能被一段区间中某些数的和表示的数.(还是看题面吧) 思路 可持久化 ...

  3. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  4. bzoj 1645: [Usaco2007 Open]City Horizon 城市地平线【线段树+hash】

    bzoj题面什么鬼啊-- 题目大意:有一个初始值均为0的数列,n次操作,每次将数列(ai,bi-1)这个区间中的数与ci取max,问n次后元素和 离散化,然后建立线段树,每次修改在区间上打max标记即 ...

  5. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  6. bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)

    Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MB Submit: 7669  Solved: 1894 [Sub ...

  7. bzoj 4771: 七彩树 树链的并+可持久化线段树

    题目大意: 给定一颗树,询问树中某个点x的子树中与其距离不超过d的所有点中本质不同的颜色数 强制在线 题解: 一下午终于把这道题叉掉了. 写了三个算法,前两个都是错的,后一个是%的网上大爷们的题解. ...

  8. BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...

  9. bzoj 2653 middle (可持久化线段树)

    middle Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1981  Solved: 1097 [Submit][Status][Discuss] ...

最新文章

  1. oracle的存储过程调试,oracle 运行普通方式及调试debug方式存储过程性能区别
  2. 超详细派克斯使用安装教程
  3. 百万级微信服务号如何做活动运营和用户运营?
  4. #include 中的stat.h文件到底在哪个目录下面?
  5. 移动端的注册登录设计灵感!
  6. c语言由n个斐波纳函数,6、C语言 —— 字符串
  7. 构造函数与new关键字
  8. 点到点链路上的 OSPF
  9. Android系统信息获取 之十三:Linux内核版本信息获取
  10. VScode 搭建 django 开发环境(MAC、Python3.7)
  11. 客户端无刷新调用服务器程序
  12. C语言编写几何平均数的函数,Excel 计算几何平均值:GEOMEAN函数
  13. 微信小程序:全新圣诞节头像框制作生成微信小程序源码下载支持多模板
  14. 如何把kafka Log4j1.x升级到Log4j2.x ?
  15. 英文邮件中常见的英语缩写
  16. Vue中设置浏览器标签栏图标以及title
  17. FutureCar Week第四届无人驾驶及智能驾舱中国峰会将于5月在沪盛大召开
  18. 《一本书读懂24种互联网思维》用户思维1
  19. 什么是大数据?什么是数据科学
  20. 解决sudo rosdep init 报错的问题

热门文章

  1. 丁胖胖眼中的WINDOWS操作系统(一)
  2. www.SQnote.cn
  3. 蓝桥杯 ALGO-60 算法训练 矩阵乘方
  4. matlab与r语言运算速度,R语言与matlab循环时间对比
  5. 系统分析师视频教程下载
  6. 大陆集团:放弃内燃机,适用于高阶自动驾驶MK C1制动系统2020年国内投产
  7. 基于VUE+TS中引用ECharts的中国地图和世界地图密度表
  8. 洛谷P1962 斐波那契数列
  9. 区分元素特性attribute和对象属性property
  10. 主机与虚拟机不能通信