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. 然后,他给的下标是会随删除操作变化 ...
随机推荐
- Qt5
最简单的分割窗体 #include <QApplication> #include <QLabel> #include <QSplitter> int main(i ...
- 第六章 数据库设计之ER模型
在ER图中实体用方框表示 实体其实就相当于一个二维表,实体实例就相当于二维表中的一行 属性在二维表中用椭圆表示,属性就是描述实体特征的数据项 概念:键(也被成为候选键):1,属性集合K上的行唯一 ...
- Problem B. Full Binary Tree
题目 链接:http://code.google.com/codejam/contest/2984486/dashboard#s=p1 googlde code jam 2014 Round1A 解题 ...
- Vue项目使用AES做加密
1.先在vue项目中安装crypto-js 2.在项目中新建一个utils.js文件 3.utils.js文件中的内容 /** * 工具类 */ import Vue from 'vue' impor ...
- sql 各种锁
SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但 ...
- mysql套接字文件
- Hive sql和Presto sql的一些对比
最近由于工作上和生活上的一些事儿好久没来博客园了,但是写博客的习惯还是得坚持,新的一年需要更加努力,困知勉行,终身学习,每天都保持空杯心态.废话不说,写一些最近使用到的Presto SQL和Hive ...
- redis删除单个key和多个key,ssdb会落地导致重启redis无法清除缓存
redis删除单个key和多个key,ssdb会落地导致重启redis无法清除缓存,需要针对单个key进行删除 删除单个:del key 删除多个:redis-cli -a pass(密码) keys ...
- Web API设计方法论--比较完整的web api 开发过程
为Web设计.实现和维护API不仅仅是一项挑战:对很多公司来说,这是一项势在必行的任务.本系列将带领读者走过一段旅程,从为API确定业务用例到设计方法论,解决实现难题,并从长远的角度看待在Web上维护 ...
- Kafka学习之(七)搭建kafka可视化服务Kafka Eagle
一.下载安装包 kafka-eagle-bin-1.2.4.tar.gz 百度云链接:链接:https://pan.baidu.com/s/1SNIkpsvs20A_Ljtx5PaMuA 密码:o4 ...