题意:

给一个长度为\(m\)的队列,现给定以下操作:

\(opt=0\),插入一个串,如果不在队里直接插入栈尾,如果超出\(m\)删队首;在队里就拿出来重新放到队尾,返回\(v\)值。

\(opt=1\),问某串的前/中/后的串的\(v\)值是什么,不存在输出\(Invalid\)。

思路:

把串\(Hash\),然后用双向链表维护这个队列。标程建议用\(Trie\)去\(Hash\),不过也可以用\(unordered\_map\)卡过去。

代码:

/*****
双向链表板子
*****/
struct Node{ //双向链表
int v; //val或者其他属性
int pre; //前面
int nex; //后面
}p[maxn]; //p[i]表示值为i的节点 int head, tail, sz;
void ins(int ID){ //插在末尾
int u = p[tail].pre;
p[tail].pre = ID;
p[u].nex = ID;
p[ID].pre = u;
p[ID].nex = tail;
sz++;
}
void del(int ID){ //删除
int u = p[ID].pre;
int v = p[ID].nex;
p[u].nex = v;
p[v].pre = u;
sz--;
}
void init(){
head = 0; //头
tail = 1; //尾(空)
sz = 0; //链表中的节点数
p[head].nex = tail;
p[tail].pre = head;
}
#include<map>
#include<set>
#include<cmath>
#include<cstdio>
#include<stack>
#include<ctime>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 500000 + 5;
const int INF = 0x3f3f3f3f;
const ull seed = 131;
const ll MOD = 1e9 + 7;
using namespace std;
struct Node{ //双向链表
int v; //val或者其他属性
int pre; //前面
int nex; //后面
}p[maxn]; //p[i]表示值为i的节点
unordered_map<ull, int> id;
unordered_set<int> in; int head, tail, sz, tot;
void ins(int ID){ //插在末尾
int u = p[tail].pre;
p[tail].pre = ID;
p[u].nex = ID;
p[ID].pre = u;
p[ID].nex = tail;
in.insert(ID);
sz++;
}
void del(int ID){ //删除
int u = p[ID].pre;
int v = p[ID].nex;
p[u].nex = v;
p[v].pre = u;
in.erase(ID);
sz--;
}
void init(){
tot = 2;
head = 0; //头
tail = 1; //尾(空)
sz = 0;
p[head].nex = tail;
p[tail].pre = head;
}
char s[maxn];
int main(){
int T;
scanf("%d", &T);
while(T--){
int Q, m;
scanf("%d%d", &Q, &m);
id.clear();
in.clear(); init(); while(Q--){
int op, v;
char s[20];
scanf("%d%s%d", &op, s, &v);
int len = strlen(s);
ull Ha = 0;
for(int i = 0; i < len; i++)
Ha = Ha * seed + s[i];
if(id.find(Ha) == id.end()) id[Ha] = tot++;
int ID = id[Ha];
if(op == 0){
if(in.find(ID) == in.end()){
ins(ID);
p[ID].v = v;
if(sz > m) del(p[head].nex);
}
else{
del(ID);
ins(ID);
}
printf("%d\n", p[ID].v);
}
else{
if(in.find(ID) == in.end()) printf("Invalid\n");
else{
if(v == 1){
if(p[ID].nex == tail) printf("Invalid\n");
else printf("%d\n", p[p[ID].nex].v);
}
else if(v == -1){
if(p[ID].pre == head) printf("Invalid\n");
else printf("%d\n", p[p[ID].pre].v);
}
else printf("%d\n", p[ID].v);
}
}
}
}
return 0;
}

牛客多校第三场J LRU management(双向链表)题解的更多相关文章

  1. 牛客多校第三场 F Planting Trees

    牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...

  2. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  3. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  4. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  5. 牛客多校第三场 A—pacm team (4维背包加路径压缩)

    链接:https://www.nowcoder.com/acm/contest/141/A 来源:牛客网 Eddy was a contestant participating , Eddy fail ...

  6. 牛客多校第六场 J Heritage of skywalkert 随即互质概率 nth_element(求最大多少项模板)

    链接:https://www.nowcoder.com/acm/contest/144/J来源:牛客网 skywalkert, the new legend of Beihang University ...

  7. 牛客多校训练营第九场 J - Symmetrical Painting (排序)

    J - Symmetrical Painting 题意 给你\(n\)个矩形, 左下角\((i-1,\ L_i)\), 右上角\((i,\ R_i)\), 找一条线\(l\)平行于\(x\)轴, 让这 ...

  8. 牛客多校第三场-A-PACM Team-多维背包的01变种

    题目我就不贴了...说不定被查到要GG... 题意就是我们需要在P,A,C,M四个属性的限制下,找到符合条件的最优解... 这样我们就需要按照0/1背包的思路,建立一个五维度数组dp[i][j][k] ...

  9. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

随机推荐

  1. pytest学习笔记(pytest框架结构)

    一.pytest框架中使用setup.teardown.更灵活按照用例级别可以分为以下几类: 1.模块级:(setup_module.teardown_module)在模块始末调用 2.函数级:(se ...

  2. Flask之静态文件处理

    静态文件的处理 推荐 from flask import Flask,render_template app = Flask(__name__,template_folder='templates', ...

  3. 论super().__init__()的用法

    当我们调用 super() 的时候,实际上是实例化了一个 super 类. super 是个类,既不是关键字也不是函数等其他数据结构,该对象就是专门用来访问父类中的属性的(严格按照继承的关系). -- ...

  4. secrets 管理工具 Vault 的介绍、安装及使用

    原文:https://ryan4yin.space/posts/expirence-of-vault/ Vault 是 hashicorp 推出的 secrets 管理.加密即服务与权限管理工具.它的 ...

  5. linux设备

    设备初始化时同样要执行一个device_register函数,该函数传入一个struct device *类型的指针,因此要定义一个struct device类型的变量作为我们的设备. struct ...

  6. windows10复制粘贴键突然失效无法复制粘贴的最简单办法

    报了学习班,打开了VCE的加密文档 今天复制粘贴键突然失效 在网上捣鼓了好多方法都不行最后发现看看你有没有在用加密文件,也就是网课类的文档和视频.有就把它关了关了就好了

  7. ESXI6.7主机降级至ESXI6.5

    上一条博客vcenter添加主机失败:https://www.cnblogs.com/Crazy-Liu/p/11211760.html 原因esxi主机和vcenter版本不一致,因为vcenter ...

  8. CODING 再携手腾讯云 Serverless,让开发者跑步上云

    近年来,腾讯云持续在云原生领域打磨和完善产品矩阵,致力于为开发者上云提供更好的产品和服务.继前段时间 CODING CI 助力腾讯云 Serverless 全新应用控制台.持续保障 Serverles ...

  9. MySQL的双主配置

    配置MySQL双主配置,需要先配置MySQL的主从复制,传送门: 0.集群规划 hadoop105 hadoop106 hadoop107 MySQL(master,slave) MySQL(slav ...

  10. 回滚原理 Since database connections are thread-local, this is thread-safe.

    mysql django 实践: django @transaction.atomic 机制分析  1.数据库清空表Tab 2.请求django-view        @transaction.at ...