UVA129 —— Krypton Factor (氪因素)
Input and Output
In order to provide the Quiz Master with a potentially unlimited source of questions you are asked to write a program that will read input lines that contain integers n and L (in that order), where n > 0 and L is in the range , and for each input line prints out the nth hard sequence (composed of letters drawn from the first L letters in the alphabet), in increasing alphabetical order (alphabetical ordering here corresponds to the normal ordering encountered in a dictionary), followed (on the next line) by the length of that sequence. The first sequence in this ordering is A. You may assume that for given n and L there do exist at least n hard sequences.
For example, with L = 3, the first 7 hard sequences are:
A
AB
ABA
ABAC
ABACA
ABACAB
ABACABA
As each sequence is potentially very long, split it into groups of four (4) characters separated by a space. If there are more than 16 such groups, please start a new line for the 17th group.
Therefore, if the integers 7 and 3 appear on an input line, the output lines produced should be
ABAC ABA 7
Input is terminated by a line containing two zeroes. Your program may assume a maximum sequence length of 80.
Sample Input
30 3 0 0
Sample Output
ABAC ABCA CBAB CABA CABC ACBA CABA 28
题意:如果有一个字符串中包含两个相邻的重复子串,则称作容易的串,其他的则称为困难的串,要求不包含容易的串
#include <iostream> #include <cstdio> #include <vector> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; int cnt ; char ma[1100][1100]; int n, len; int p[100]; int dfs(int cur) { if(cnt == n) { for(int i = 1; i < cur; i++) { printf("%c",p[i] + 'A' -1); if(i == cur - 1) break; if(i%4==0) { if(i%64==0) putchar('\n'); else putchar(' '); } } printf("\n%d\n", cur-1); return 0; } for(int i = 1; i <= len; i++) { p[cur] = i; int ok = 1; for(int j = 1; j * 2 <= cur+1; j++) //枚举进行比较 { int flag =1; for(int k = 0; k < j; k++) { if(p[cur- k] != p[cur-j-k]) { flag = 0; break; } } if(flag ) { ok =0; break; } } if(ok) { cnt ++; if(!dfs(cur + 1)) return 0; } } return 1; } int main() { while(scanf("%d%d",&n,&len) != EOF) { cnt = 0; if(!n && !len) break; dfs(1); } return 0; }