LRU management
字典树用来查找值,实现map<string,int>操作
tips:tot必须从一开始QAQ
#include<bits/stdc++.h>
using namespace std;
#define maxn 5000005
int trie[maxn][];
///字典树主要用来查找
int ed[maxn];
///记录字符串s对应的数据存在的下标
int dat[maxn];
int L[maxn],R[maxn];
///维护一下前驱后继关系
int A[maxn];
///记录一下字典树中指向该下标i的ed坐标,删除的时候要把ed[j]置为0
int tot=,//tot必须从一开始==
siz,num,s,e;//s,e维护一下头尾节点,便于维护前驱后继
void erase(int t)//传入删除数据的坐标信息
{
///int p=1;
//int t=find(s);
R[L[t]]=R[t];
L[R[t]]=L[t];
///字典树怎么处理?
///不处理QAQ???ed[p]???
if(t==s)
{
s=R[t];
}
if(t==e)
{
e=L[t];
}
dat[t]=R[t]=L[t]=;
ed[A[t]]=;
///把字典树中指向t的指针去掉
siz--;
}
void ins(int t,int dt)///维护下数据,处理下节点关系
{
dat[t]=dt;
///前驱后继维护?t-1?
///弄一个头指针,尾指针类似的下标维护
if(s==)s=e=t;///头节点为空
else L[R[e]=t]=e;//尾节点移到t
R[t]=;
e=t;
siz++;
}
void insert(char *s1,int t)
{
int n=strlen(s1);
int p=;//都从1开始
for(int i=; i<n; i++)
{
if(!trie[p][s1[i]-''])///都是判断trie[p][s1[i]-'0']
{
trie[p][s1[i]-'']=++tot;
}
p=trie[p][s1[i]-''];
} A[t]=p;
ed[p]=t;
}
int search(char *s)
{
int n=strlen(s);
int p=;
for(int i=; i<n; i++)
{
if(!trie[p][s[i]-''])return false;
else p=trie[p][s[i]-''];
}
return ed[p];///维护在数组中信息 }
int T,n,m;
void init()
{ /*while(s){
erase(s);
}*/
//trie[1][0]=trie[1][1]=0;
for(int i=; i<=max(tot,num); i++)
{
A[i]=;//dat[i]=0;
dat[i]=L[i]=R[i]=ed[i]=;
for(int j=; j<; j++)trie[i][j]=;
} tot=;siz=;
s=e=;
num=; } int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
int op,d;
char s1[];
while(n--)
{
scanf("%d%s%d",&op,s1,&d);
if(op==)
{
int x=search(s1);
// cout<<x<<" "<<s1<<endl;
if(x)
{ cout<<dat[x]<<'\n';
d=dat[x];
erase(x);
}
else
{
cout<<d<<'\n';
}
num++;
ins(num,d);
insert(s1,num);
//int _x=search(s1);
//cout<<"SEAR"<<s1<<' '<<_x<<" "<<dat[_x]<<endl;
//cout<<"INS"<<num<<" "<<s1<<" "<<d<<endl;
if(siz>m)
{
//puts("MAN");
// cout<<"ERA"<<s<<endl;
erase(s);
}
}
else
{
int x=search(s1);
if(x==)
{
//puts("MY");
puts("Invalid");
}
else if(d==&&R[x]==)
{
puts("Invalid");
}
else if(d==-&&L[x]==)
{
puts("Invalid");
}
else
{
if(d==)cout<<dat[x]<<'\n';
else if(d==)cout<<dat[R[x]]<<'\n';
else cout<<dat[L[x]]<<'\n'; } } }
} }
LRU management的更多相关文章
- 牛客第三场 J LRU management
起初看到这道题的时候,草草就放过去了,开了另一道题,结果开题不顺利,总是感觉差一点就可以做出来,以至于一直到最后都没能看这道题qaq 题意:类似于操作系统上讲的LRU算法,有两个操作,0操作代表访问其 ...
- 2019牛客暑期多校训练营(第三场) - J - LRU management - 模拟
https://ac.nowcoder.com/acm/contest/883/J 根据这个数据结构的特点,也就是计算机组成原理里面学过的cache的LRU管理算法,每次访问都会在cache中查询一页 ...
- 2019牛客暑期多校训练营(第三场) J LRU management 模拟链表操作
输入n, m,n表示n种操作,m表示最多可以容纳m个串. 第一种操作:先在容器里找是否存在这个串,如果不存在,则添加在末尾,这个串携带了一个值v. 如果存在,则先把之前存在的那个拿出来,然后在后面添加 ...
- 【2019牛客暑期多校第三场】J题LRU management
题目链接 题意 好吧,这道题我其实看都没看过,队友跟我说了说这道题是模拟题,卡时间.然后我就上了-- 大致就是维护一个线性表,然后有两种操作:插入.查询 插入时,如果这个值(string)之前出现过, ...
- 牛客多校第三场J LRU management(双向链表)题解
题意: 给一个长度为\(m\)的队列,现给定以下操作: \(opt=0\),插入一个串,如果不在队里直接插入栈尾,如果超出\(m\)删队首:在队里就拿出来重新放到队尾,返回\(v\)值. \(opt= ...
- 2019牛客多校第三场J-LRU management(map+双向链表)
LRU management 题目传送门 解题思路 用map索引对应地址,用双向链表维护序列. 代码如下 #include <bits/stdc++.h> #define INF 0x3f ...
- Redis info参数总结(转)
Redis官网对 info 已经讲解的比较清楚的,参考文档 . 可以看到,info的输出结果是分几块的,有Servers.Clients.Memory等等,通过info后面接这些参数,可以指定输出某一 ...
- 关于Redis info的参数总结
Redis官网对 info 已经讲解的比较清楚的,参考文档 .可以看到,info的输出结果是分几块的,有Servers.Clients.Memory等等,通过info后面接这些参数,可以指定输出某一块 ...
- redis info命令结果释疑
redis的性能数据这块用 info 命令就可以获取的比较全面了,下面是对info信息返回值的解释: # 参考:http://redis.io/commands/info # # # Server r ...
随机推荐
- Week 12 - 673.Number of Longest Increasing Subsequence
Week 12 - 673.Number of Longest Increasing Subsequence Given an unsorted array of integers, find the ...
- 练习4-python+selenium+pandas
最近对于python的第三方库pandas比较有兴趣,在学习的过程中也简单的结合selenium做了一个简单的小工具 最新公司用一个外部系统来记录,追踪BUG,可是这个系统并不是专业的BUG管理系统, ...
- jdbc步骤:
一.注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); 二.建立连接(Connection) Connection conn = Dri ...
- Java8的I/O整理
一.什么是I/O? Java的核心库java.io提供了全面的IO接口.包括:文件读写.标准设备输出等.Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入. 二.什 ...
- 002/CDN-内容分发网络
CDN-内容分发网络 来自于今日头条: https://www.toutiao.com/a6531234862563590663/?tt_from=weixin&utm_campaign=cl ...
- JS 数组的常用方法归纳之不改变原数组和其他
不改变原数组的方法 concat() 连接两个或多个数组,不改变现有数组,返回新数组,添加的是数组中的元素 join(",") 把数组中的所有元素放入一个字符串,通过‘,’分隔符进 ...
- Java8 特性详解(一) Lambda
为什么要使用lambda表达式 从函数式接口说起 理解Functional Interface(函数式接口)是学习Java8 lambda表达式的关键所在. 函数式接口的定义其实很简单:任何接口,如果 ...
- Codeforces 1159F Winding polygonal line(叉积)
其实这个几何写起来还是比较方便,只用到了叉积.首先我们贪心的考虑一种情况,对于任意给定的LR串,我们起点的选择肯定是在这些点围成的凸包端点上,对于这样的起点来说,他对于L或者R都是有选择的机会,而且一 ...
- POJ-2528 Mayor's posters (离散化, 线段树)
题目传送门: POJ-2528 题意就是在一个高度固定的墙面上贴高度相同宽度不同的海报,问贴到最后还能看到几张?本质上是线段树区间更新问题,但是要注意的是题中所给数据范围庞大,直接搞肯定会搞出问题,所 ...
- 使用控制台搭建vue-cli脚手架
注意: 1.安装前您需要查看自己是否有node环境 检查:node - v 2.如果没有的话,需要先搭建好才能进行下一步操作 (参考:https://www.cnblogs.com/sylys/p/ ...