zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    Android 自定义View (一)
    Java enum的用法详解
    Android Application的使用及其生命周期
    android 支持的语言列表(汇总)
    android 使用String.format("%.2f",67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号
    TN2151:崩溃报告
    android 各国语言对应的缩写
    uva 1401 dp+Trie
    教你3网页特效免费下载栅极材料必不可少的一步,无需工具
    编译命令行终端 swift
  • 原文地址:https://www.cnblogs.com/onioncyc/p/8059095.html
Copyright © 2011-2022 走看看