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;
}
完结散花
PCwqyy

浙公网安备 33010602011771号