899F - Letters Removing
Codeforces 899F - Letters Removing
思路:考虑一下怎么找到输入的l和r在原来串中的位置,我们想到用前缀和来找,一开始所有位置都为1,删掉后为0,那么前缀和为l的位置就是l的位置,前缀和为r的位置就是r的位置。
那么用树状数组来维护一下前缀和,再用二分查找来找到位置就可以了。然后找到的区间可能很大,然而我们要删的只有一种字符,把每种字符的位置分开来保存来操作,可以用set也可以用vector。
代码1(set版,187ms):
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a)) const int N=2e5+;
int bit[N];
bool vis[N];
int n;
set<int>pos[];
void add(int x,int a)
{
while(x<=n)
{
bit[x]+=a;
x+=x&(-x);
}
}
int sum(int x)
{
int ans=;
while(x)
{
ans+=bit[x];
x-=x&(-x);
}
return ans;
}
int search(int x)
{
int l=,r=n,m=(l+r)>>;
while(l<r)
{
if(sum(m)>=x)r=m;
else l=m+;
m=(l+r)>>;
}
return m;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int m,l,r;
string s;
char c;
cin>>n>>m>>s;
for(int i=;i<=n;i++)add(i,),pos[s[i-]].insert(i);
while(m--)
{
cin>>l>>r>>c;
l=search(l);
r=search(r);
set<int>::iterator it=pos[c].lower_bound(l);
while(it!=pos[c].end())
{
if(*it>r)break;
add(*it,-);
pos[c].erase(it++);
}
}
for(int i=;i<;i++)
{
for(auto x:pos[i])vis[x]=true;
}
for(int i=;i<=n;i++)if(vis[i])putchar(s[i-]);
puts("");
return ;
}
代码2(vector版,155ms):
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a)) const int N=2e5+;
int bit[N];
bool vis[N];
int n;
vector<int>pos[];
void add(int x,int a)
{
while(x<=n)
{
bit[x]+=a;
x+=x&(-x);
}
}
int sum(int x)
{
int ans=;
while(x)
{
ans+=bit[x];
x-=x&(-x);
}
return ans;
}
int search(int x)
{
int l=,r=n,m=(l+r)>>;
while(l<r)
{
if(sum(m)>=x)r=m;
else l=m+;
m=(l+r)>>;
}
return m;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
int m,l,r;
string s;
char c;
cin>>n>>m>>s;
for(int i=;i<=n;i++)add(i,),pos[s[i-]].pb(i);
while(m--)
{
cin>>l>>r>>c;
l=search(l);
r=search(r);
int it=lower_bound(pos[c].begin(),pos[c].end(),l)-pos[c].begin();
for(int i=it;i<pos[c].size();i++)
{
if(pos[c][i]>r)break;
if(!vis[pos[c][i]])add(pos[c][i],-),vis[pos[c][i]]=true;
}
}
for(int i=;i<=n;i++)if(!vis[i])putchar(s[i-]);
puts("");
return ;
}
899F - Letters Removing的更多相关文章
- codeforces 899F Letters Removing set+树状数组
F. Letters Removing time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 899F Letters Removing 线段树/树状数组
虽然每次给一个区间,但是可以看作在区间内进行数个点操作,同样数列下标是动态变化的,如果我们将每个字符出现看作1,被删除看作0,则通过统计前缀和就能轻松计算出两个端点的位置了!这正是经典的树状数组操作 ...
- Codeforces 899 F. Letters Removing (二分、树状数组)
题目链接:Letters Removing 题意: 给你一个长度为n的字符串,给出m次操作.每次操作给出一个l,r和一个字符c,要求删除字符串l到r之间所有的c. 题解: 看样例可以看出,这题最大的难 ...
- 【CodeForces】899 F. Letters Removing
[题目]F. Letters Removing [题意]给定只含小写字母.大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串.n&l ...
- Codeforces 889F Letters Removing(二分 + 线段树 || 树状数组)
Letters Removing 题意:给你一个长度为n的字符串,然后进行m次删除操作,每次删除区间[l,r]内的某个字符,删除后并且将字符串往前补位,求删除完之后的字符串. 题解:先开80个set ...
- Letters Removing CodeForces - 899F (线段树维护序列)
大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...
- Codeforces Round #452 F. Letters Removing
Description Petya has a string of length n consisting of small and large English letters and digits. ...
- codeforce452DIV2——F. Letters Removing
题意:给一个字符串和m个操作,每次给出l,r,c,把字符串中l-r这段区间的字符为c的字符删掉,求最后的字符串.(n,m<=2e5)线段树.注意这个区间修改和普通区间修改的区别. 他们都是用树状 ...
- CF899F. Letters Removing
给一个字符串支持以下操作:区间删除某个特定字符.最后输出字符串.n,m<=200000. 这题我居然不会可以回家了.. 首先,单点删除,选个平衡树比如set. 然后,他给的下标是会随删除操作变化 ...
随机推荐
- java class遍历属性
private void iterateClass(Object object) { Field[] fields = object.getClass().getDeclaredFields(); f ...
- jq table页二级联动
<div class="layerRtb layerRtb-threecolumn"> <div class="clearfix layerRtb-he ...
- python 不同集合上元素的迭代 chain()
itertools.chain()可以接受一个可迭代对象列表作为输入,并返回一个迭代器,有效的屏蔽掉在多个容器中迭代细节 >>> from itertools import chai ...
- Java设计模式应用——过滤器模式
storm引擎计算出一批中间告警结果,会发送一条kafka消息给告警入库服务,告警入库服务接收到kafka消息后读取中间告警文件,经过一系列处理后把最终告警存入mysql中. 实际上,中间告警结果可能 ...
- 20145316许心远《网络对抗》MSF基础应用
20145316许心远<网络对抗>MSF基础应用 实验后回答问题 用自己的话解释什么是exploit,payload,encode. exploit:顾名思义就是攻击嘛,因为是个动词,所以 ...
- 案例:java进制互转
十 进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBina ...
- C++算法原理与实践(面试中的算法和准备过程)
第0部分 简介 1. 举个例子:面试的时候,可能会出一道算法考试题,比如写一个 strstr 函数——字符串匹配. 可能会想到用KMP算法来解题,但是该算法很复杂,不适宜在面试中使用. 1.1 C++ ...
- 编译安装vsftpd-3.0.2
编译安装vsftpd 首先下载源码包(我一般喜欢放在/home/test) 解压:tar -zxvf vsftpd-3.0.2.tar.gz 进入目录进行编译 cd vsftpd-3.0.2 编译之前 ...
- 20145335郝昊《网络攻防》Exp4 Msf基础
20145335郝昊<网络攻防>Exp4 Msf基础 实验内容 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路. 一个主动攻击,如ms08_067; 一个针对浏览器的 ...
- C++ compile Microsoft Visual C++ Static and Dynamic Libraries
出处:http://www.codeproject.com/Articles/85391/Microsoft-Visual-C-Static-and-Dynamic-Libraries 出处:http ...