LRU Algorithm Gym - 102394L (HASH)
LRU Algorithm
\]
题意
给出 \(n\) 个数字和 \(m\) 次查询。
每次询问中,给出 \(L\) 表示 \(LRU\) 中缓存器的大小,再给出 \(L\) 个数字,问对 \(n\) 个数字做大小为 \(L\) 的 \(LRU\) 过程中,会不会有某一时刻,缓存器中的数字序列和给出的 \(L\) 个数字一致。
思路
首先对于 \(LRU\) 算法,当缓存器大小为 \(L\)时,以某个位置 \(pos\) 结束的缓存器中的元素,本质上就是从 \(pos\) 往前的 \(L\) 个第一次出现的不同的数字。所以每次查询我们只要想办法找出以每个位置结束,往前 \(L\) 个不同的数字是什么,然后判断和所查询的序列是否一致,就可以知道是 \(Yes\) 或者是 \(No\) 了。
首先发现 \(n=5000\),那么可以 \(n^2\) 暴力预处理出 \(has[i][j]\),表示从 \(i\) 开始,往前 \(j\) 个不同的数字所构成的 \(hash\) 值,然后只要判断给出的 \(L\) 个数字的 \(hash\) 值是否满足条件就可以了。注意判断一下不满 \(L\) 个元素的情况,那就还要求找到的 \(pos\) 位置以前只存在给出的数字。
/***************************************************************
> File Name : L.cpp
> Author : Jiaaaaaaaqi
> Created Time : Tue 12 Nov 2019 04:58:09 PM CST
***************************************************************/
#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#define lowbit(x) x & (-x)
#define mes(a, b) memset(a, b, sizeof a)
#define fi first
#define se second
#define pb push_back
#define pii pair<int, int>
typedef unsigned long long int ull;
typedef long long int ll;
const int maxn = 5e3 + 10;
const int maxm = 1e5 + 10;
const ll mod = 1e9 + 7;
const ll INF = 1e18 + 100;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-8;
using namespace std;
int n, m;
int cas, tol, T;
int aa[maxn];
int a[maxn], b[maxn];
int vis[maxn], pre[maxn];
ull has[maxn][maxn], seed = 233;
int main() {
// freopen("in", "r", stdin);
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++) scanf("%d", &aa[i]);
int len1 = 0, len2 = 0;
for(int i=1; i<=n; i++) {
if(n==0 || aa[i]!=a[len1]) a[++len1] = aa[i];
}
for(int i=1; i<=n; i++) vis[i] = pre[i] = 0;
for(int i=1; i<=n; i++) {
pre[i] = pre[i-1];
if(vis[a[i]] == 0) pre[i]++;
vis[a[i]]++;
}
for(int i=n; i>=1; i--) {
for(int j=1; j<=n; j++) vis[j] = 0;
int cnt = 0;has[i][0] = 0;
for(int j=i; j>=1; j--) {
if(vis[a[j]] == 0) {
cnt++;
has[i][cnt] = has[i][cnt-1] * seed + a[j];
}
vis[a[j]]++;
}
}
while(m--) {
scanf("%d", &len2);
for(int i=1; i<=len2; i++) scanf("%d", &b[i]);
bool flag = 0;
while(len2 && b[len2] == 0) len2--, flag = 1;
if(len2 == 0) {
printf("Yes\n");
continue;
}
ull ans = 0;for(int i=1; i<=len2; i++) ans = ans*seed+b[i];
int pos = 0;
for(int i=1; i<=len1; i++) {
if(has[i][len2] == ans) {
pos = i;
break;
}
}
if(pos && (!flag || (flag && pre[pos]==len2))) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}
LRU Algorithm Gym - 102394L (HASH)的更多相关文章
- 哈希(Hash)与加密(Encrypt)相关内容
1.哈希(Hash)与加密(Encrypt)的区别 哈希(Hash)是将目标文本转换成具有相同长度的.不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的.可 ...
- 数据结构之哈希(hash)表
最近看PHP数组底层结构,用到了哈希表,所以还是老老实实回去看结构,在这里去总结一下. 1.哈希表的定义 这里先说一下哈希(hash)表的定义:哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过 ...
- redis学习-散列表常用命令(hash)
redis学习-散列表常用命令(hash) hset,hmset:给指定散列表插入一个或者多个键值对 hget,hmget:获取指定散列表一个或者多个键值对的值 hgetall:获取所欲哦键值以及 ...
- 【Redis】命令学习笔记——哈希(hash)(15个超全字典版)
本篇基于redis 4.0.11版本,学习哈希(hash)相关命令. hash 是一个string类型的field和value的映射表,特别适合用于存储对象. 序号 命令 描述 实例 返回 HSET ...
- 《数据结构与算法分析——C语言描述》ADT实现(NO.05) : 散列(Hash)
散列(Hash)是一种以常数复杂度实现查找功能的数据结构.它将一个关键词Key,通过某种映射(哈希函数)转化成索引值直接定位到相应位置. 实现散列有两个关键,一是哈希函数的选择,二是冲突的处理. 对于 ...
- HDU 1880 魔咒词典 (Hash)
魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 哈希(hash)理解
转载自https://www.cnblogs.com/mingaixin/p/4318837.html 一.什么是哈希?(一种更复杂的映射) Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就 ...
- ruby 对象转换哈希(Hash)
通过 ActiveRecord 从数据库的某张数据表(table)中获取的对象如何转换成为 Hash orders_table 是一张订单信息表,对应的 model 为 Orders @order = ...
- 哈希表(hash)详解
哈希表结构讲解: 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. ...
随机推荐
- SpringBoot集成Spring Security(4)——自定义表单登录
通过前面三篇文章,你应该大致了解了 Spring Security 的流程.你应该发现了,真正的 login 请求是由 Spring Security 帮我们处理的,那么我们如何实现自定义表单登录呢, ...
- golang strings常用函数
package main import ( "fmt" "strings" ) func main() { s1 := " aBc" s2 ...
- Docker使用compose(原Fig)快速编配
Docker使用compose(原Fig)快速编配 目录 安装 应用 构建以及运行 安装 在Linux上安装Fig: 在OS上安装: 在Linux上安装Fig: sudo bash-c "c ...
- Dictionary不可以迭代修改值
var buffer = new List<string>(showDict.Keys); foreach (var key in buffer) { if (showDict[key] ...
- 乘法器——booth编码
博主最近在学习加法器.乘法器.IEEE的浮点数标准,作为数字IC的基础.当看到booth编码的乘法器时,对booth编码不是很理解,然后在网上找各种理解,终于豁然开朗.现将一个很好的解释分享给大家,希 ...
- 「vue基础」一篇浅显易懂的 Vue 路由使用指南( Vue Router 上)
大家好,今天的内容,我将和大家一起聊聊 Vue 路由相关的知识,如果你以前做过服务端相关的开发,那你一定会对程序的URL结构有所了解,我没记错的话也是路由映射的概念,需要进行配置. 其实前端这些框架的 ...
- DateTime的ToString方法格式
新建一个.NET Core控制台项目,敲入如下代码: using System; namespace NetCoreDatetime { class Program { static void Mai ...
- 数据库IN查询参数化改造的方法
// 批量查询的 2019-05-14 if (!string.IsNullOrWhiteSpace(Request["userCodes"])) { string userCod ...
- 有哪位大侠操作过NPOI生成word文档,如何设置页眉页脚距离顶部和底部距离?
#region 1.创建文档(页眉.页脚) XWPFDocument doc = new XWPFDocument(); //页面设置 A4:w=11906 h=16838 doc.Document. ...
- LearnOpenGL笔记(2)三角形
这是学习LearnOpenGL CN教程的笔记,包括我遇到的问题和我的烂笔头.文章名与网站小节对应. ------------------------------------分割线---------- ...