首页 > 代码库 > Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)D Dense Subsequence

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

传送门:D Dense Subsequence

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

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

AC代码:

 1 #include "stdio.h" 2 #include "string.h" 3 int main() 4 { 5     int m,k,flag,i,j,c[30],now; 6     char s[100005]; 7     while(scanf("%d",&m)!=EOF) 8     { 9         getchar();10         gets(s);11         memset(c,0,sizeof(c));12         int l=strlen(s);13         for(j=0+a; j<26+a; j++)14         {15             k=0;flag=1;16             for(i=0; i<l; i++)17             {18                 k++;19                 if(s[i]<=j)20                 {21                     k=0;22                     if(s[i]==j) c[j-a]++;23                 }24                 if(k>=m)25                     flag=0;26             }27             if(flag) break;28         }29         k=0;c[j-a]=0;now=0;30         for(i=0; i<l; i++)31         {32             k++;33             if(s[i]<j)34                 k=0;35             else if(s[i]==j)36                 now=i;37             if(k==m)38             {39                 k=0;40                 i=now;41                 c[j-a]++;42             }43         }44         for(i=0; i<=26; i++)45         {   //printf("%d ",c[i]);46             for(j=0; j<c[i]; j++)47                 printf("%c",i+a);48         }49         printf("\n");50     }51     return 0;52 }

 

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