HDU - 4731 Minimum palindrome 找规律

本文探讨了一道编程题目,旨在构造长度为m的字符串,使其回文子串数量最少且字典序最小。针对不同字母种类n提出了具体的解决策略,包括特殊情况的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给你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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值