题意:

给一个长度为\(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(双向链表)题解相关推荐

  1. 24dian(牛客多校第三场)

    24dian(牛客多校第三场) 题意: 给你n张牌,每张牌的大小为1 ~ 13,问这些牌与加减乘除任意组合(可以使用括号),且但所有的有效解在计算过程中都涉及到分数,即非整数,能否组成答案m,如果可以 ...

  2. 牛客多校第三场 B【Classical String Problem】

    牛客多校第三场 B[Classical String Problem] 链接:https://ac.nowcoder.com/acm/contest/5668/B 来源:牛客网 题目描述 Given ...

  3. 牛客多校第三场A【Clam and fish】贪心

    A[Clam and fish]贪心 链接:https://ac.nowcoder.com/acm/contest/5668/A 来源:牛客网 题目: There is a fishing game ...

  4. 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 ...

  5. 2020牛客多校第三场[C Operation Love+基础计算几何 判断多边形顺逆时针]

    题目链接 题目大意:就是给你两个左右手的模型,下面给出这两只手通过平移变换之后坐标问你这只手是左手还是右手?[题目保证坐标是按照顺时针或者逆时针给出的] 解题思路:首先我们先观察一下这只右手:假如数据 ...

  6. 2019牛客多校第三场 F.Planting Trees

    题目链接 题目链接 题解 题面上面很明显的提示了需要严格\(O(n^3)\)的算法. 先考虑一个过不了的做法,枚举右下角的\((x,y)\),然后二分矩形面积,枚举其中一边,则复杂度是\(O(n^3 ...

  7. 2019 牛客多校第三场 B Crazy Binary String

    题目链接:https://ac.nowcoder.com/acm/contest/883/B 题目大意 给定一个长度为 N 的 01 字符串,输出最长子串和子序列的长度,满足其中 0 和 1 的个数相 ...

  8. 2022年牛客多校第三场补题记录

    A Ancestor 题意:给出两棵 nnn 个节点的树 A,BA,BA,B,A,BA,BA,B 树上每个节点均有一个权值,给出 kkk 个关键点的编号 x1,x2,⋯,xkx_1, x_2, \cd ...

  9. Splay ---- 2018牛客多校第三场 区间翻转搞区间位移 或者 rope可持久化块状链表

    题目链接 题目大意: 就是每次把牌堆中若干个连续的牌放到堆顶,问你最后牌的序列. 解题思路: Splay 区间翻转的模板题: 对于一个区间[1,2,3,4,5,6,7,8][1,2,3,4,5,6,7 ...

  10. Math(牛客多校第三场)

    Math 题意: 问你有多少对(x,y),1<=x<=y<=n,满足(x2 + y2)%(xy+1) == 0 题解: 这种题...直接打表芜湖~ 通过打表发现:满足情况的为(i,i ...

最新文章

  1. Python正则表达式常用的15个符号整理
  2. linux内核提供的内存操作函数
  3. 经典php代码,10个非常经典的php代码片段.doc
  4. mysql忘记root密码恢复
  5. 解决larave-dompdf中文字体显示问题
  6. 成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'express'
  7. Ubuntu默认Python版本选择
  8. 简易语音助手—python
  9. 紫猫插件php,简易中控紫猫插件版(3)压缩包使用说明
  10. WORD无法复制文件:无法读源文件或磁盘
  11. 【数据分析实战】杭州2019年链家在售房源数据分析
  12. DRGs与RBRVS的理解
  13. 图片数据损坏了怎么恢复
  14. 【Web前端】彼岸の花——网上花店(网页制作)
  15. java动态代理实现与原理详细分析
  16. prototype原型练习 前端校招面试
  17. 2、OpenCV图像的读写操作
  18. dicom文件tag详解
  19. win10win11win7打印机连接共享错误0x00709打印失败错误修复工具
  20. 基于RFID定位技术的工地人员定位--新导智能

热门文章

  1. 中国水稻大省创新大米销售模式 启动2019首场拍卖
  2. 2.移植3.4内核-支持烧写yaffs2,裁剪内核并制作补丁
  3. (剑指Offer)面试题58:二叉树的下一个结点
  4. T-SQL之条件链接
  5. 安装active directory
  6. 我的博客之[网管日志]
  7. idea license 20200104
  8. mac好用的软件 小总结 Alfred
  9. vuex使用及自定义Vue指令vue-permission
  10. 搜索引擎Elasticsearch,这篇文章给讲透了(建议收藏)