C. Alphabetic Removals
time limit per test
2 secondsmemory limit per test
256 megabytesinput
standard inputoutput
standard outputYou are given a string k times:
- if there is at least one letter 'a', remove the leftmost occurrence and stop the algorithm, otherwise go to next item;
- if there is at least one letter 'b', remove the leftmost occurrence and stop the algorithm, otherwise go to next item;
- ...
- remove the leftmost occurrence of the letter 'z' and stop the algorithm.
This algorithm removes a single letter from the string. Polycarp performs this algorithm exactly k characters.
Help Polycarp find the resulting string.
Input
The first line of input contains two integers 1≤k≤n≤4⋅105) — the length of the string and the number of letters Polycarp will remove.
The second line contains the string n lowercase Latin letters.
Output
Print the string that will be obtained from k times.
If the resulting string is empty, print nothing. It is allowed to print nothing or an empty line (line break).
Examples
input
Copy
15 3
cccaabababaccbc
output
Copy
cccbbabaccbc
input
Copy
15 9
cccaabababaccbc
output
cccccc
input
1 1
u
output
u
题意:给你一个字符串,你可以对这个字符串做k次操作,每次操作遵循这个规则:从a开始删除、删完a后删b...一直删到z
题解:用一个数组来存字符串中各个字母的个数,然后从a开始删,记录到不能删除的那个位置然后用另一个字符串来保存输出
代码如下
View Code
#include<bits/stdc++.h> using namespace std; int n; string str; int k; vector<int> cnt(26); int main() { cin>>n>>k; cin>>str; for(int i=0; i<n; i++) { cnt[str[i]-'a']++; } //记录下每个字母的数量 //从a开始减去存在的字母 //如果没有了 就记录下还可以输出的字母 int pos=26; for(int i=0; i<26; i++) { if(k>=cnt[i]) { k-=cnt[i]; } else { pos=i; break; } } string ans; int rem=k; for(int i=0; i<n; i++) { int cur=str[i]-'a'; //在pos后面的字母可以用 //用完了k的字母可以用 if(cur>pos||(cur==pos&&rem==0)) { ans+=str[i]; } else if(cur==pos) { rem--; } } cout<<ans<<endl; return 0; }