CF999C Alphabetic Removals 题解

Content

给定一个长度为 \(n\) 的仅含小写字母的字符串,执行 \(k\) 次如下操作:

  • 如果字符串中有 a 这个字母,删除从左往右第一个 a,并结束操作,否则继续操作;
  • 如果字符串中有 b 这个字母,删除从左往右第一个 b,并结束操作,否则继续操作;
  • 以此类推,如果所有字母都按照如上方式删除完了,那么结束操作。

现在请你求出操作后的字符串。

数据范围:\(1\leqslant n,k\leqslant 4\times 10^5\)

Solution

直接从左往右扫过去,按照上面的方式删除每个字母,直到删除完 \(k\) 个字符为止即可。

Code

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;

string s;
int n, k, vis[400007];
char cur = 'a';

int main() {
	scanf("%d%d", &n, &k);
	cin >> s;
	while(1) {
		int flag = 1;
		for(int i = 0; i < n; ++i)
			if(s[i] == cur) {
				vis[i] = 1;
				k--;
				if(!k) {flag = 0; break;}
			}
		if(!flag) break;
		cur++;
	}
	for(int i = 0; i < n; ++i)
		if(!vis[i]) printf("%c", s[i]);
	return 0;
}
posted @ 2021-12-16 15:10  Eason_AC  阅读(54)  评论(0)    收藏  举报