• 【CodeForces】899 F. Letters Removing


    【题目】F. Letters Removing

    【题意】给定只含小写字母、大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串。n<=2*10^5。

    【算法】树状数组+平衡树(set)

    【题解】因为坐标是序列变动后的,动态坐标可以转化为找到第l个存在的数字到第r个存在的数字之间的范围。

    将序列中存在记为1,删除记为0,转化为找前缀和恰好为l和r的位置,这是树状数组的经典操作,详见这篇题解介绍的方法(简单的排名功能)

    找到l和r在原数组的位置后,接下来需要删除。因为字符个数不多,对每个字符开一个set记录位置,然后lower_bound后逐个删除即可。

    复杂度O(n log n)。

    #include<cstdio>
    #include<cstring>
    #include<set>
    #include<cctype>
    #include<algorithm>
    using namespace std;
    const int maxn=200010,M=62;
    int n,m,a[maxn],c[maxn];
    char S[maxn],SS[10];
    set<int>s[63];
    set<int>::iterator it,itt;
    int read(){
        char c;int s=0,t=1;
        while(!isdigit(c=getchar()))if(c=='-')t=-1;
        do{s=s*10+c-'0';}while(isdigit(c=getchar()));
        return s*t;
    }
    #define lowbit(x) (x&-x)
    void modify(int x){for(int i=x;i<=n;i+=lowbit(i))c[i]--;}
    int ask(int x){int as=0;for(int i=x;i>=1;i-=lowbit(i))as+=c[i];return as;}
    int find(int x){
        int num=0,p=0;
        for(int i=20;i>=0;i--)if(p+(1<<i)<=n&&num+c[p+(1<<i)]<x)num+=c[p+=(1<<i)];
        return p+1;
    }
    int p(char c){
        if('a'<=c&&c<='z')return c-'a'+1;
        if('A'<=c&&c<='Z')return c-'A'+27;
        return c-'0'+53;
    }
    int main(){
        n=read();m=read();
        scanf("%s",S+1);
        for(int i=1;i<=n;i++){
            a[i]=p(S[i]);
            s[a[i]].insert(i);
        }
        for(int i=1;i<=n;i++)c[i+lowbit(i)]+=++c[i];
        for(int i=1;i<=m;i++){
            int l=find(read()),r=find(read()),x;
            scanf("%s",SS);x=p(SS[0]);
            it=s[x].lower_bound(l);
            while(it!=s[x].end()&&*it<=r)modify(*it),itt=it,it++,s[x].erase(itt);
        }
        for(int i=1;i<=n;i++)if(ask(i)-ask(i-1))printf("%c",S[i]);
        return 0;
    }        
    View Code
  • 相关阅读:
    php递归无限分类、根据子类获取所有顶类
    PHP+Redis 有序集合实现 24 小时排行榜实时更新
    php操作redis常用方法代码示例
    Mysql 数据库默认值选 ''" 、Null和Empty String的区别
    linux查看端口占用情况
    php获取微信openid
    phpstorm 删除空行
    git常用操作命令归纳
    Redis数据类型
    渴求式加载指定字段、加载多个关联关系、嵌套的渴求式加载、带条件约束的渴求式加载
  • 原文地址:https://www.cnblogs.com/onioncyc/p/8059095.html
Copyright © 2020-2023  润新知