Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)D Dense Subsequence

时间:2021-09-16 06:40:56

传送门:D Dense Subsequence

题意:输入一个m,然后输入一个字符串,从字符串中取出一些字符组成一个串,要求满足:在任意长度为m的区间内都至少有一个字符被取到,找出所有可能性中字典序最小的情况,并按字典序输出

思路:字典序 例如 aaaaaaab < ab  也就是说,如果满足要求的取法中取到了b 那么所有的a都应该被取到,这样才可以保证字典序最小,那么也就是说在26个字母中找到一定要被取的最大字母,然后再确定最大的字母的个数,比它小的全部要取

AC代码:

 #include "stdio.h"
#include "string.h"
int main()
{
int m,k,flag,i,j,c[],now;
char s[];
while(scanf("%d",&m)!=EOF)
{
getchar();
gets(s);
memset(c,,sizeof(c));
int l=strlen(s);
for(j=+'a'; j<+'a'; j++)
{
k=;flag=;
for(i=; i<l; i++)
{
k++;
if(s[i]<=j)
{
k=;
if(s[i]==j) c[j-'a']++;
}
if(k>=m)
flag=;
}
if(flag) break;
}
k=;c[j-'a']=;now=;
for(i=; i<l; i++)
{
k++;
if(s[i]<j)
k=;
else if(s[i]==j)
now=i;
if(k==m)
{
k=;
i=now;
c[j-'a']++;
}
}
for(i=; i<=; i++)
{ //printf("%d ",c[i]);
for(j=; j<c[i]; j++)
printf("%c",i+'a');
}
printf("\n");
}
return ;
}