蛤省省选题。
一道彻头彻尾的码农题。
该题的主要知识点有:字符串hash,平衡树。(两颗平衡树?)。
4T用splay怎么都调不过。可能是由于splay常数太大。(想写treap,但又实在不想写)。
字符串hash不想写啊,用map水的话时限卡着。
这题就当我过了吧...
过不去的程序:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<map>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<ctime>
#include<queue>
using namespace std;
#define LL long long
#define FILE "dealing"
#define eps 1e-10
#define db double
#define pii pair<int,int>
#define up(i,j,n) for(int i=j;i<=n;i++)
int read(){
int x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
const int maxn=600000,mod=1000000007,inf=1000000007;
bool cmin(int& a,int b){return a>b?a=b,true:false;}
bool cmax(int& a,int b){return a<b?a=b,true:false;}
int n;
//namespace tree{
int siz[maxn],c[maxn][2],cnt=0,rt,fa[maxn];
pii val[maxn];
void updata(int x){siz[x]=siz[c[x][0]]+siz[c[x][1]]+1;}
void rotate(int x){
int y=fa[x],z=fa[y],d=c[y][1]==x;
if(z)c[z][c[z][1]==y]=x;
fa[y]=x;fa[x]=z;if(c[x][d^1])fa[c[x][d^1]]=y;
c[y][d]=c[x][d^1],c[x][d^1]=y;
updata(y);updata(x);
}
void splay(int x,int S){
while(fa[x]!=S){
int y=fa[x],z=fa[y];
if(z!=S){
if(c[z][1]==y^c[y][1]==x)rotate(x);
else rotate(y);
}
rotate(x);
}
if(!S)rt=x;
}
int getK(int k){//右边有k个数的数
int x=rt;
while(x){
if(k==siz[c[x][1]])return x;
if(k>siz[c[x][1]])k-=(siz[c[x][1]]+1),x=c[x][0];
else x=c[x][1];
}
return -1;
}
int insert(pii key){
if(!rt){rt=++cnt;val[rt]=key;siz[rt]=1;return rt;}
int x=rt,y;
while(x){
y=x;
x=c[x][key>val[x]];
}
x=++cnt;
fa[x]=y;
val[x]=key;
siz[x]=1;
c[y][key>val[y]]=x;
updata(y);
splay(y,0);
return x;
}
int findl(int x){x=c[x][0];while(c[x][1])x=c[x][1];return x;}
int findr(int x){x=c[x][1];while(c[x][0])x=c[x][0];return x;}
void delet(int x){
splay(x,0);
int y=findl(x),z=findr(x);
splay(y,0);
splay(z,y);
c[z][0]=fa[x]=0;
updata(z),updata(y);
}
//};
string s[maxn],ch;
map<string,int> t;
void dfs(int x){
if(c[x][0])dfs(c[x][0]);
cout<<s[n-val[x].second]<<" "<<val[x].first<<endl;
if(c[x][1])dfs(c[x][1]);
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
ios::sync_with_stdio(true);
n=read();
insert(make_pair(inf,-1));
insert(make_pair(-inf,-1));
up(i,1,n){
char w;
cin>>w;
if(w=='+'){
cin>>ch;
s[i]=ch;
int key;cin>>key;
if(t.count(ch))delet(t[ch]);
t[ch]=insert(make_pair(key,n-i));
continue;
}
if(w=='?'){
cin>>ch;
if(ch[0]>='A'&&ch[0]<='Z'){
int x=t[ch];
splay(x,0);
cout<<siz[c[x][1]]<<endl;
}
else {
int k=0;
up(j,0,ch.length()-1)
k=k*10+ch[j]-'0';
int y=k;
while(k-y<10){
int x=n-val[getK(k)].second;
if(x!=-1)cout<<s[x]<<" ";
k++;
}
cout<<endl;
}
continue;
}
//dfs(rt);
//cout<<endl;
}
return 0;
}