牛客多校第三场J LRU management(双向链表)题解
题意:
给一个长度为\(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;
}
转载于:https://www.cnblogs.com/KirinSB/p/11301693.html
牛客多校第三场J LRU management(双向链表)题解相关推荐
- 24dian(牛客多校第三场)
24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...
- 牛客多校第三场 B【Classical String Problem】
牛客多校第三场 B[Classical String Problem] 链接:https://ac.nowcoder.com/acm/contest/5668/B 来源:牛客网 题目描述 Given ...
- 牛客多校第三场A【Clam and fish】贪心
A[Clam and fish]贪心 链接:https://ac.nowcoder.com/acm/contest/5668/A 来源:牛客网 题目: There is a fishing game ...
- exgcd ---- 2020牛客多校第三场:[Fraction Construction Problem:exgcd+思维题]
题目链接 题目大意:就是给你两个数a,ba,ba,b叫你求满足下面三个条件的c,d,e,fc,d,e,fc,d,e,f 1.cd−ef=ab1.{c\over d}-{e\over f}={a\ove ...
- 2020牛客多校第三场[C Operation Love+基础计算几何 判断多边形顺逆时针]
题目链接 题目大意:就是给你两个左右手的模型,下面给出这两只手通过平移变换之后坐标问你这只手是左手还是右手?[题目保证坐标是按照顺时针或者逆时针给出的] 解题思路:首先我们先观察一下这只右手:假如数据 ...
- 2019牛客多校第三场 F.Planting Trees
题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...
- 2019 牛客多校第三场 B Crazy Binary String
题目链接:https://ac.nowcoder.com/acm/contest/883/B 题目大意 给定一个长度为 N 的 01 字符串,输出最长子串和子序列的长度,满足其中 0 和 1 的个数相 ...
- 2022年牛客多校第三场补题记录
A Ancestor 题意:给出两棵 nnn 个节点的树 A,BA,BA,B,A,BA,BA,B 树上每个节点均有一个权值,给出 kkk 个关键点的编号 x1,x2,⋯,xkx_1, x_2, \cd ...
- Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表
题目链接 题目大意: 就是每次把牌堆中若干个连续的牌放到堆顶,问你最后牌的序列. 解题思路: Splay 区间翻转的模板题: 对于一个区间[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7 ...
- Math(牛客多校第三场)
Math 题意: 问你有多少对(x,y),1<=x<=y<=n,满足(x2 + y2)%(xy+1) == 0 题解: 这种题...直接打表芜湖~ 通过打表发现:满足情况的为(i,i ...
最新文章
- Python正则表达式常用的15个符号整理
- linux内核提供的内存操作函数
- 经典php代码,10个非常经典的php代码片段.doc
- mysql忘记root密码恢复
- 解决larave-dompdf中文字体显示问题
- 成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'express'
- Ubuntu默认Python版本选择
- 简易语音助手—python
- 紫猫插件php,简易中控紫猫插件版(3)压缩包使用说明
- WORD无法复制文件:无法读源文件或磁盘
- 【数据分析实战】杭州2019年链家在售房源数据分析
- DRGs与RBRVS的理解
- 图片数据损坏了怎么恢复
- 【Web前端】彼岸の花——网上花店(网页制作)
- java动态代理实现与原理详细分析
- prototype原型练习 前端校招面试
- 2、OpenCV图像的读写操作
- dicom文件tag详解
- win10win11win7打印机连接共享错误0x00709打印失败错误修复工具
- 基于RFID定位技术的工地人员定位--新导智能