Loading

CF999C

所属题目:CF999C Alphabetic Removals

题目大意

先按照按照字典序,再按照从左往右删掉前 \(k\) 个字符。

思路一

先按照字典序排序,通过下标操作删掉前 \(k\) 个字符。
再按照输入顺序排回来,输出。
时间复杂度:\(O(n\ log\ n)\)

代码

#include<cstdio>
#include<algorithm>
using std::sort;
struct Char{char a;int In;}Str[400100];
bool Cmp1(Char m,Char n)
{
	if(m.a==n.a)	return m.In<n.In;
	else			return m.a<n.a;
}
bool Cmp2(Char m,Char n)
{
	if(m.In==n.In)	return m.a<n.a;
	else			return m.In<n.In;
}
int N,K;
int main()
{
	scanf("%d %d\n",&N,&K);
	for(int i=0;i<N;i++)
		scanf("%c",&Str[i].a),
		Str[i].In=i;
	sort(Str,Str+N,Cmp1);
	sort(Str+K,Str+N,Cmp2);
	for(int i=K;i<N;i++)
		printf("%c",Str[i].a);
	return 0;
}

思路二

按着题意,每次枚举要删除的字母,删除并计数,直到删完为止。
时间复杂度:\(O(26\ n)\)

代码

#include<cstdio>
#include<cstdlib>
int N,K,D;
char Str[400100];
bool Out[400100];
void Print()
{
	if(K>0) return;
	for(int i=0;i<N;++i)
		if(!Out[i])
			printf("%c",Str[i]);
	exit(0);
	return;
}
int main()
{
	scanf("%d %d\n%s",&N,&K,Str);
	for(int i='a',j=0;i<='z';i++)
		for(int j=0;j<=N;j++)
			if(Str[j]==i)
				Out[j]=true,
				K--,Print();
	return 0;
}

完结散花

posted @ 2022-11-14 13:40  PCwqyy  阅读(31)  评论(0)    收藏  举报  来源