【CodeForces】899 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=,M=;
int n,m,a[maxn],c[maxn];
char S[maxn],SS[];
set<int>s[];
set<int>::iterator it,itt;
int read(){
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}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=;for(int i=x;i>=;i-=lowbit(i))as+=c[i];return as;}
int find(int x){
int num=,p=;
for(int i=;i>=;i--)if(p+(<<i)<=n&&num+c[p+(<<i)]<x)num+=c[p+=(<<i)];
return p+;
}
int p(char c){
if('a'<=c&&c<='z')return c-'a'+;
if('A'<=c&&c<='Z')return c-'A'+;
return c-''+;
}
int main(){
n=read();m=read();
scanf("%s",S+);
for(int i=;i<=n;i++){
a[i]=p(S[i]);
s[a[i]].insert(i);
}
for(int i=;i<=n;i++)c[i+lowbit(i)]+=++c[i];
for(int i=;i<=m;i++){
int l=find(read()),r=find(read()),x;
scanf("%s",SS);x=p(SS[]);
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=;i<=n;i++)if(ask(i)-ask(i-))printf("%c",S[i]);
return ;
}
【CodeForces】899 F. Letters Removing的更多相关文章
- Codeforces 899 F. Letters Removing (二分、树状数组)
题目链接:Letters Removing 题意: 给你一个长度为n的字符串,给出m次操作.每次操作给出一个l,r和一个字符c,要求删除字符串l到r之间所有的c. 题解: 看样例可以看出,这题最大的难 ...
- 【CodeForces】914 F. Substrings in a String bitset
[题目]F. Substrings in a String [题意]给定小写字母字符串s,支持两种操作:1.修改某个位置的字符,2.给定字符串y,查询区间[l,r]内出现y多少次.|s|,Σ|y|&l ...
- 【CodeForces】961 F. k-substrings 字符串哈希+二分
[题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...
- 【CodeForces】960 F. Pathwalks 主席树+动态规划
[题目]F. Pathwalks [题意]给定n个点m条边的有向图,可能不连通有重边有自环.每条边有编号 i 和边权 wi ,求最长的路径(可以经过重复节点)满足编号和边权都严格递增.n,m,wi&l ...
- 【CodeForces】626 F. Group Projects 动态规划
[题目]F. Group Projects [题意]给定k和n个数字ai,要求分成若干集合使得每个集合内部极差的总和不超过k的方案数.n<=200,m<=1000,1<=ai< ...
- 【CodeForces】915 F. Imbalance Value of a Tree 并查集
[题目]F. Imbalance Value of a Tree [题意]给定n个点的带点权树,求所有路径极差的和.n,ai<=10^6 [算法]并查集 [题解]先计算最大值的和,按点权从小到大 ...
- 【CodeForces】870 F. Paths
[题目]F. Paths [题意]给定数字n,图上有编号为1~n的点,两点当且仅当gcd(u,v)≠1时有连边,定义d(u,v)为两点间最短距离(若不连通则为0),求Σd(u,v),1<=u&l ...
- 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP
[题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...
- 【CodeForces】899 E. Segments Removal
[题目]E. Segments Removal [题意]给定n个数字,每次操作删除最长的连续相同数字(等长删最左),求全部删完的最少次数.n<=2*10^6,1<=ai<=10^9. ...
随机推荐
- nodepad++ 格式化xml插件
1.用插件管理器安装xmltools插件 2.使用如下菜单格式化xml: 所有插件下载地址: http://sourceforge.net/projects/npp-plugins/files/
- 第6题 ZigZag转换
题目描述如下: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of ro ...
- 七周七语言之使用prolog解决爱因斯坦斑马难题
如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/06/28/sevenlang-prolog/. 目 ...
- 3dContactPointAnnotationTool开发日志(二九)
今天想着在Windows平台上跑通那个代码,不过它的官网上写的支持平台不包括windows,但我还是想试试,因为看他的依赖好像和平台的关系不是特别大. 看了下它的py代码,不知道是py2还是p ...
- 【第三周】每周psp
代码累计 300+575+475=1250 随笔字数 1700+3000+3785=8485 知识点 Cppunit框架 Ui设计 Scrum站立会议 燃尽图(好像没燃起来) 博客写作技能 本周主要是 ...
- PHP 在windows下配置sendmail,通过 mail() 函数发送邮件
php mail()函数在windows不能用,需要安装sendmail. 1. 从http://glob.com.au下载sendmail.zip 2. 解压sendmail.zip到目录下(最好使 ...
- 【前端学习笔记】arguments相关
arguments转数组: (function() { console.log(arguments instanceof Array); // --> false console.log(Obj ...
- HDU4669_Mutiples on a circle
题目的意思是给你一些数字a[i](首位相连),现在要你选出一些连续的数字连续的每一位单独地作为一个数位.现在问你有多少种选择的方式使得选出的数字为k的一个倍数. 其实题目是很简单的.由于k不大(200 ...
- tarjan强连通分量模板(pascal)
友好城市 [问题描述]小 w 生活在美丽的 Z 国. Z 国是一个有 n 个城市的大国, 城市之间有 m 条单向公路(连接城市 i. j 的公路只能从 i 连到 j). 城市 i. j 是友好城市当且 ...
- 【bzoj3573】[HNOI2014]米特运输 树形dp
题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个城 ...