http://codeforces.com/problemset/problem/159/C
题意就是给你k个相同的字符串S,有n个操作,每次操作时把第p个字母c去掉,问最后得到的串。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 #define lson l,m,rt<<1 6 #define rson m+1,r,rt<<1|1 7 #define maxn 2000 8 struct node{ 9 int cnt[26]; 10 }setree[maxn<<2]; 11 char ss[maxn][105],s[105]; 12 int cnt[26],n; 13 void pushup(int rt) 14 { 15 for(int i=0;i<26;i++) 16 setree[rt].cnt[i]=setree[rt<<1].cnt[i]+setree[rt<<1|1].cnt[i]; 17 } 18 void build(int l,int r,int rt) 19 { 20 if(l==r){ 21 memset(setree[rt].cnt,0,sizeof(setree[rt].cnt)); 22 strcpy(ss[l],s); 23 for(int i=0;i<26;i++) 24 setree[rt].cnt[i]=cnt[i]; 25 return; 26 } 27 int m=(l+r)>>1; 28 build(lson); 29 build(rson); 30 pushup(rt); 31 } 32 void update(int l,int r,int rt,int num,char c) 33 { 34 if(l==r){ 35 setree[rt].cnt[c-'a']--; 36 int i=-1; 37 while(num--){ 38 i++; 39 while(ss[l][i]!=c) 40 i++; 41 } 42 ss[l][i]='0'; 43 return; 44 } 45 int m=(l+r)>>1; 46 if(setree[rt<<1].cnt[c-'a']>=num) 47 update(lson,num,c); 48 else 49 update(rson,num-setree[rt<<1].cnt[c-'a'],c); 50 pushup(rt); 51 } 52 void query(int l,int r,int rt) 53 { 54 if(l==r){ 55 for(int i=0;i<n;i++) 56 if(ss[l][i]!='0') 57 putchar(ss[l][i]); 58 return; 59 } 60 int m=(l+r)>>1; 61 query(lson); 62 query(rson); 63 } 64 int main() 65 { 66 int k; 67 scanf("%d%s",&k,s); 68 memset(cnt,0,sizeof(cnt)); 69 n=strlen(s); 70 for(int i=0;i<n;i++) 71 cnt[s[i]-'a']++; 72 build(1,k,1); 73 int m; 74 scanf("%d",&m); 75 while(m--){ 76 int num; 77 char op[5]; 78 scanf("%d%s",&num,op); 79 update(1,k,1,num,op[0]); 80 } 81 query(1,k,1); 82 return 0; 83 }