模拟题,用map建立一个 list 的指针与内容的双向映射。
注意即使使用scanf 也不要用 cin 来读入。map 支持直接字符指针的查询。
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
typedef pair<string ,int> pii;
unordered_map< string,list<pii>::iterator > ma;
list<pii> lis;
int main(){
int T;
int op,v;
scanf("%d",&T);
char str[20];
while(T--){
ma.clear();
lis.clear();
int q,m;
scanf("%d%d",&q,&m);
for( int i = 1;i <= q;i++ ){
scanf("%d%s%d",&op,str,&v);
auto pp = ma.find(str);
if( op == 0 ){
if( pp != ma.end() ){
lis.push_back( pii( str,pp->second->second ) );
printf("%d\n", pp->second->second);
auto p = lis.end();
lis.erase( pp->second );
ma[str] = --p;
}else{
lis.push_back( pii( str,v ) );
auto p = lis.end();--p;
ma[str] = p;
printf("%d\n",v);
}
while( lis.size() > m ){
ma.erase( ma.find(lis.begin()->first) );
lis.pop_front();
}
}else{
if( pp != ma.end() ){
auto p = ma[str];
if( v==1 ){
++p;
if( p == lis.end() ){
puts("Invalid");
}else{
printf("%d\n",p->second);
}
}else if( v==-1 ){
if( p == lis.begin() ){
puts("Invalid");
}else{
--p;
printf("%d\n",p->second);
}
}else{
printf("%d\n", p->second);
}
}else{
puts("Invalid");
}
}
}
}
return 0;
}