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 ...
随机推荐
- KETTLE——(二)数据抽取
过了个春节,好长时间没有更新了,今天接着写第二部分——数据抽取. 进入界面以后会发现左侧菜单有两个东西:转换和作业:简单说一下,转换是单次的转换,不可重复,但可重复利用:作业是汇聚了其他操作和多次(可 ...
- spring mvc 接受数组
@RequestParam(value = "customerIds[]")Integer[] customerIds 加上 requestParam value设置为 &qu ...
- kNN算法实例(约会对象喜好预测和手写识别)
import numpy as np import operator import random import os def file2matrix(filePath):#从文本中提取特征矩阵和标签 ...
- V-Parenthesis 前缀+ZKW线段树或RMQ
Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of length n and q questions. The i-th questio ...
- 高性能和可扩展的React-Redux
注意:文章很长,只想了解逻辑而不深入的,可以直接跳到总结部分. 初识 首先,从它暴露对外的API开始 ReactReduxContext /* 提供了 React.createContext(null ...
- LeetCode103. 二叉树的锯齿形层次遍历
103. 二叉树的锯齿形层次遍历 描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 示例 例如,给定二叉树: [3,9,2 ...
- mysql常见的查询语句
select * from 表名 查询此表所有数据 select * from 表名 where 字段名 > 判断条件 查询某表中的某字段符合条件的数据 select * f ...
- Python 爬虫 校花网
爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 福利来了 校花网 ,首先说为什么要爬这个网站呢,第一这个网站简单爬起来容易,不会受到打击,第二呢 你懂得.... 1.第一步,需要下 ...
- Anaconda 安装及Python 多版本间切换
安装 Anaconda 安装anaconda 安装较为简单,这里参考官方文档:https://docs.continuum.io/anaconda/install/linux.html 在文件目录下执 ...
- linux中的一些常用命令
shutdown -h now 现在马上关机 shutdown -r now 现在重新启动 reboot 现在重新启动 su - 如果当前是普通用户,则输入这条命令切换到管理员用户(root),如果要 ...