Codeforces Round #490 (Div. 3) C. Alphabetic Removals

1,题目描述:

C,按字母序列删除。
给你一个长度为n的由小写字母组成的字符串s。P想要删除k个字母从s字符串中。
P用下面描述的算法k次:
*如果存在‘a’就删除最左边出现的那个病停止计算,否则进行下一项
*如果存在‘b’就删除最左边出现的那个病停止计算,否则进行下一项
*…….
*删除最左边出现的‘z’,并停止计算。
这个算法每次只能从字符串中,删除一个字符串。P操作k次,因为删除k个字母。
帮助P找到最终的结果字符串。
输入:
第一行包括两个整数n和k(1~4e5)字符串的长度和P可以删除的字符数。
第二行是字符串s
输出:
输出P删除k个字符后最终得到的结果。
如果字符串是空的,允许不输出任何东西或者输出空的一行。

2,题目链接: ##http://codeforces.com/contest/999/problem/C

3,通过的代码:

1.(自己的代码)
代码注释:
*用二维int数组a存每个字母出现的位置。每个字母的0坐标位置存该字母的个数。
*共操作k次,从字母a的位置开始标志,如果可以删除就把该字符串中的该位置标记

#include<iostream>
#include<string>
using namespace std;
const int N=4e5+6;
int a[30][N],vis[N];
int main(){
    int n,k;cin>>n>>k;
    string str;cin>>str;
    for(int i=0;i<n;i++){
        a[str[i]-'a'][++a[str[i]-'a'][0]]=i;
    }
    for(int i=0;i<26;i++){
        if(k==0)break;
        if(k>=a[i][0]){
            for(int j=1;j<=a[i][0];j++)vis[a[i][j]]=1;k-=a[i][0];
        }else{
            for(int j=1;j<=k;j++)vis[a[i][j]]=1;k=0;
        }
    }
    for(int i=0;i<n;i++)if(!vis[i])cout<<str[i];
    cout<<endl;
}

2.
(大神的代码)

*代码注释:

#include<iostream>
#include<algorithm>
using namespace std;
int n,i,j,k,t[500];
string s,q;
int main(){
    cin>>n>>k>>s;
    q=s;
    sort(q.begin(),q.end());
    for(int i=0;i<k;i++)t[q[i]]++;
    for(int i=0;i<n;i++)if(t[s[i]])t[s[i]]--;else cout<<s[i];
}

猜你喜欢

转载自blog.csdn.net/light2chasers/article/details/80772994