zoukankan      html  css  js  c++  java
  • Codeforces 159C String Manipulation 1.0

    http://codeforces.com/problemset/problem/159/C

    题意就是给你k个相同的字符串S,有n个操作,每次操作时把第p个字母c去掉,问最后得到的串。

    AC Code
     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 }
  • 相关阅读:
    使用offerShow小程序查询程序员薪水
    StoryBoard中使用segue传值
    在Xcode11中添加launchImage
    OC之打乱对象数组
    HDU Today
    洛谷:P1048 采药
    洛谷:P1928 外星密码
    洛谷:P1757 通天之分组背包
    洛谷:P1115 最大子段和
    洛谷:P1104 生日
  • 原文地址:https://www.cnblogs.com/kim888168/p/3048253.html
Copyright © 2011-2022 走看看