Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)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 }