#include #include #include #include #include using namespace std; #define MAXABC 10000 #define MAXK 10000 int main(void) { int values[0xff]; char abc[10000], *word, maxchar, minchar; int n, k, temp = 0; FILE* in = fopen("nthword.in", "rt"); fscanf(in, "%s\n", abc); fscanf(in, "%d %d", &k, &n); fclose(in); //printf("%s %d %d", abc, k, n); for(int ii = 0; ii < 0xff; ++ii) { values[ii] = -1; } // cab --> 2=0, 0=1, 1=2 for(int ii = 0; ii < strlen(abc); ++ii) { values[abc[ii]] = ii; } minchar = abc[0]; maxchar = abc[strlen(abc)-1]; word = new char[k + 1]; for(int ii = 0; ii < k; ++ii) { word[ii] = minchar; } word[k] = '\0'; while(temp < n) { // get next word int x = k - 1; while(true) { if(word[x] == maxchar) { word[x] == minchar; --x; } else { // printf("%d %d %d %c\n", x, word[x], values[word[x]], abc[values[word[x]]]); word[x] = abc[values[word[x]] + 1]; break; } } // is interesting? int is_interesting = 1; int all_same = 1; for(int split = 1; split < k; ++split) { for(int ii = 0; ii < k; ++ii) { char snd = word[(ii + split) % k]; if(word[ii] > snd) { is_interesting = 0; break; } if(word[ii] < snd) { all_same = 0; break; } } if(all_same) is_interesting = 0; if(!is_interesting) break; } if(is_interesting) { //printf("--> %s\n", word); temp++; } else { //printf("X %s\n", word); } } FILE* out = fopen("nthword.out", "wt"); fprintf(out, "%s", word); fclose(out); return 0; }