博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
899F - Letters Removing
阅读量:6246 次
发布时间:2019-06-22

本文共 2485 字,大约阅读时间需要 8 分钟。

思路:考虑一下怎么找到输入的l和r在原来串中的位置,我们想到用前缀和来找,一开始所有位置都为1,删掉后为0,那么前缀和为l的位置就是l的位置,前缀和为r的位置就是r的位置。

那么用树状数组来维护一下前缀和,再用二分查找来找到位置就可以了。然后找到的区间可能很大,然而我们要删的只有一种字符,把每种字符的位置分开来保存来操作,可以用set也可以用vector。

代码1(set版,187ms):

#include
using namespace std;#define ll long long#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))const int N=2e5+5;int bit[N];bool vis[N];int n;set
pos[123];void add(int x,int a){ while(x<=n) { bit[x]+=a; x+=x&(-x); }}int sum(int x){ int ans=0; while(x) { ans+=bit[x]; x-=x&(-x); } return ans;}int search(int x){ int l=1,r=n,m=(l+r)>>1; while(l
=x)r=m; else l=m+1; m=(l+r)>>1; } return m;}int main(){ ios::sync_with_stdio(false); cin.tie(0); int m,l,r; string s; char c; cin>>n>>m>>s; for(int i=1;i<=n;i++)add(i,1),pos[s[i-1]].insert(i); while(m--) { cin>>l>>r>>c; l=search(l); r=search(r); set
::iterator it=pos[c].lower_bound(l); while(it!=pos[c].end()) { if(*it>r)break; add(*it,-1); pos[c].erase(it++); } } for(int i=0;i<123;i++) { for(auto x:pos[i])vis[x]=true; } for(int i=1;i<=n;i++)if(vis[i])putchar(s[i-1]); puts(""); return 0;}

代码2(vector版,155ms):

#include
using namespace std;#define ll long long#define pb push_back#define mem(a,b) memset(a,b,sizeof(a))const int N=2e5+5;int bit[N];bool vis[N];int n;vector
pos[123];void add(int x,int a){ while(x<=n) { bit[x]+=a; x+=x&(-x); }}int sum(int x){ int ans=0; while(x) { ans+=bit[x]; x-=x&(-x); } return ans;}int search(int x){ int l=1,r=n,m=(l+r)>>1; while(l
=x)r=m; else l=m+1; m=(l+r)>>1; } return m;}int main(){ ios::sync_with_stdio(false); cin.tie(0); int m,l,r; string s; char c; cin>>n>>m>>s; for(int i=1;i<=n;i++)add(i,1),pos[s[i-1]].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
r)break; if(!vis[pos[c][i]])add(pos[c][i],-1),vis[pos[c][i]]=true; } } for(int i=1;i<=n;i++)if(!vis[i])putchar(s[i-1]); puts(""); return 0;}

 

转载于:https://www.cnblogs.com/widsom/p/8086142.html

你可能感兴趣的文章
POJ 3680 Intervals
查看>>
【总结整理】微信“不友好”设计其背后的逻辑---摘自人人都是产品经理
查看>>
51nod 1217 Minimum Modular
查看>>
.js 兼容 FireFox 和 IE 键盘事件
查看>>
java学习之部分笔记
查看>>
78. Subsets
查看>>
JavaScript高级之词法作用域和作用域链
查看>>
ServletConfig详解 (转载)
查看>>
oracle 查看用户所在的表空间
查看>>
CentOS配置sshd
查看>>
利用libevent的timer实现定时器interval
查看>>
接口的使用
查看>>
LeetCode 347. Top K Frequent Elements
查看>>
二叉树遍历
查看>>
JAVA 并发
查看>>
Markdown引用微博图床被防盗链不加载响应403完美解决
查看>>
0302思考并回答一些问题
查看>>
Sphinx的介绍和原理探索
查看>>
php中mysql数据库操作类 -李盛鹏 -博客园
查看>>
coreseek增量索引
查看>>