题目大意:给你n种字母,要求你组成长度为m的字符串,使得这个字符串的回文子串达到最小,且字符串的字典序最小
解题思路:当n为1时,直接就全是a了
当n大于等于三时,以abc为一个子串,不断的重复
当n==2时比较麻烦,首先分为2大种情况
A. m <= 8的情况,8种情况下的字符串分别为
a
ab
aab
aabb
aaaba
aaabab
aaababb
aaababbb
B.当m > 8的情况,先输出aa,然后以aababb为子串不断的重复,最后看还需要填补多少个,如果需要填补的数量小于等于4,就全部补上a,如果大于4就补上aaaab
#include<cstdio>
#include<cstring>
#include<algorithm>
char ch[28] = "abc";
char ans[10] = "aababb";
int main() {
int test, mark = 1, n, m;
scanf("%d", &test);
while(test--) {
scanf("%d%d", &m, &n);
printf("Case #%d: ", mark++);
if(m == 1) {
for(int i = 0; i < n; i++)
printf("a");
printf("\n");
}
if(m >= 3) {
for(int i = 0; i < n; i++)
printf("%c", ch[i % 3]);
printf("\n");
}
if(m == 2) {
if(n == 1)
printf("a");
else if(n == 2)
printf("ab");
else if(n == 3)
printf("aab");
else if(n== 4)
printf("aabb");
else if(n == 5)
printf("aaaba");
else if(n == 6)
printf("aaabab");
else if(n == 7)
printf("aaababb");
else if(n == 8)
printf("aaababbb");
else{
printf("aa");
int tmp = (n - 2) / 6;
for(int i = 0; i < tmp; i++)
printf("%s", ans);
int t = (n - 2) % 6;
if(t <= 4)
for(int i = 0; i < t; i++)
printf("a");
else
printf("aaaab");
}
printf("\n");
}
}
return 0;
}