题意:

给一个长度为\(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. 入门OJ:最短路径树入门

    题目描述 n个城市用m条双向公路连接,使得任意两个城市都能直接或间接地连通.其中城市编号为1..n,公路编号为1..m.任意个两个城市间的货物运输会选择最短路径,把这n*(n-1)条最短路径的和记为S ...

  2. IOC技术在前端项目中的应用

    目录 背景 什么是IOC 如何实现一个IOC 第一步:实现一个容器 第二步:用好装饰器 第三步:使用容器 扩展和展望 最后 背景 前端发展至今已经过去30余年,前端应用领域在不断壮大的过程中,也变得越 ...

  3. Flask源码流程分析(一)

    Flask源码流程分析: 1.项目启动: 1.实例化Flask对象 1. 重要的加载项: * url_rule_class = Rule * url_map_class = Map * session ...

  4. NAT模式、路由模式、桥接模式的区别

    NAT模式 NAT模式概述 NAT是"Network Address Translation"的缩写,中文意思是"网络地址转换",它允许一个整体机构以一个公用I ...

  5. CSRF Laravel Cross Site Request Forgery protection¶

    Laravel 使得防止应用 遭到跨站请求伪造攻击变得简单. Laravel 自动为每一个被应用管理的有效用户会话生成一个 CSRF "令牌",该令牌用于验证授权用 户和发起请求者 ...

  6. numpy pandas 学习

    一. 数组要比列表效率高很多 numpy高效的处理数据,提供数组的支持,python默认没有数组.pandas.scipy.matplotlib都依赖numpy. pandas主要用于数据挖掘,探索, ...

  7. 题解【CF1444A Division】

    题面 t 组数据. 给定参数 p,q,求一个最大的 x,满足 \((x|p)∧(q∤x)\). \(1\le t \le 500\),\(1\le p \le10^{18}\),\(2\le q\le ...

  8. 不要在nodejs中阻塞event loop

    目录 简介 event loop和worker pool event loop和worker pool中的queue 阻塞event loop event loop的时间复杂度 Event Loop中 ...

  9. Be accepted for inclusion in the IEEE INFOCOM 2018 technical program

    中了一篇INFOCOM,虽然不是一作但也是入学之后一直做的一份工作,算是没白下功夫吧.超声波定位这类工作,老实说,想应用到实际产品中,还是有一段路要走的. 老实说我也一直犹豫毕设的这套东西搞清楚了要不 ...

  10. 一条sql查出数据库某张表的所有属性

    select t.TABLE_NAME,--表名 t.COLUMN_NAME,--字段名 t.DATA_TYPE,--字段属性 t.DATA_LENGTH,--类型长度 t.DATA_PRECISIO ...