码迷,mamicode.com
首页 > 其他好文 > 详细

【CodeForces】F. Letters Removing

时间:2017-12-19 00:55:46      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:记录   i++   print   close   alt   targe   let   ++   www.   

【题目】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

 

【CodeForces】F. Letters Removing

标签:记录   i++   print   close   alt   targe   let   ++   www.   

原文地址:http://www.cnblogs.com/onioncyc/p/8059095.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!