1 #include<cstdio>
 2 #include<cstring>
 3 #define MAXN 200010
 4 char s[MAXN];
 5 int tree[26][MAXN<<2];
 6 bool vis[MAXN];
 7 inline void PushUp(int t,int rt)
 8 {
 9     tree[t][rt]=tree[t][rt<<1]+tree[t][rt<<1|1];
10 }
11 void Update(int t,int x,int L,int R,int rt)
12 {
13     if(L==R)
14         tree[t][rt]=1;
15     else
16     {
17         int mid=(L+R)>>1;
18         if(mid>=x)
19             Update(t,x,L,mid,rt<<1);
20         else
21             Update(t,x,mid+1,R,rt<<1|1);
22         PushUp(t,rt);
23     }
24 }
25 int Find(int t,int x,int L,int R,int rt)
26 {
27     if(L==R)
28     {
29         tree[t][rt]=0;
30         return L;
31     }
32     int ans,mid=(L+R)>>1;
33     if(tree[t][rt<<1]>=x)
34         ans=Find(t,x,L,mid,rt<<1);
35     else
36     {
37         x-=tree[t][rt<<1];
38         ans=Find(t,x,mid+1,R,rt<<1|1);
39     }
40     PushUp(t,rt);
41     return ans;
42 }
43 int main()
44 {
45     char ch;
46     int k,i,j,q,len,n;
47     while(~scanf("%d %s%d",&k,s+1,&q))
48     {
49         memset(vis,false,sizeof(vis));
50         memset(tree,0,sizeof(tree));
51         len=strlen(s+1);
52         n=len*k;
53         for(j=len+1;--k;)
54         {
55             for(i=1;i<=len;i++)
56                 s[j++]=s[i];
57         }
58         s[j]=0;
59         for(i=1;s[i];i++)
60             Update(s[i]-'a',i,1,n,1);
61         while(q--)
62         {
63             scanf("%d %c",&i,&ch);
64             k=Find(ch-'a',i,1,n,1);
65             vis[k]=true;
66         }
67         for(i=1;s[i];i++)
68         {
69             if(!vis[i])
70                 putchar(s[i]);
71         }
72         putchar('\n');
73     }
74     return 0;
75 }
posted on 2012-05-22 13:06  DrunBee  阅读(388)  评论(0编辑  收藏  举报