题意:

给一个长度为\(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. 权限管理3-整合Spring Security

    一.Spring Security介绍 1.框架介绍 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安 ...

  2. celery 动态配置定时任务

    How to dynamically add or remove tasks to celerybeat? · Issue #3493 · celery/celery https://github.c ...

  3. Lambda架构正是这样一种用来处理不能够直接实时计算问题的通用架构

    https://mp.weixin.qq.com/s/BGHOw12iCASJy1pgkYZi3w 当数据处理做不到实时,应该怎么办?

  4. Jenkins部署web项目到Tomcat(热部署)

    使用这个方式的话需要tomcat中有初始时Manage这个项目,本质上是通过http://ip:port/manager/html这个地址的上传接口进行上传,进行热部署(需要远程tomcat 必须开启 ...

  5. libuv事件循环中的三种句柄

    1.说明 本文会简单介绍 libuv 的事件循环,旨在入门级别的使用,而不做深入探究,简单来说就是,会大概用就行,先用熟练了,再去探究原理和源码 下图为官网的 libuv 的不同部分及其涉及的子系统的 ...

  6. Jenkins免密码登录

    Jenkins免密码登录 相关内容原文地址: 简书:海边的卡夫卡丶:Jenkins免密码登录 昨天惊现一个神奇的问题,Jenkins无法登录,无论是初始化的账号密码,还是admin用户,都登录不进去了 ...

  7. C++基本之--静态成员函数和静态成员变量

    #include <iostream> using namespace std; class Internet { public: Internet(char *name,char *ad ...

  8. Calendar 日期判断 等于 。小于。大于

    public static void main(String[] args) throws Exception { String startTime = "2012-12-12 12:45: ...

  9. 31-1.解决service iptables save出错

    CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替.service命令只保留下了极少部分使用 ...

  10. 设计模式(五)——原型模式(加Spring框架源码分析)

    原型模式 1 克隆羊问题 现在有一只羊 tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10 只羊. 2 传统方式解决克隆羊问题 1) 思路分析(图 ...