HDU 4731 Minimum Palindrome

hdu 4731 Minimum palindrome
题意:前n个字母形成一个m长的字符串,要求如下:
1、最长回文串最小
2、字典序最小
思路:
1.n=1, aaaa……
2.n=2,打表找规律


1 a
2 ab
3 aab
4 aabb
5 aaaba
6 aaabab
7 aaababb
8 aaababbb
9 aaaababba
10 aaaababbaa
11 aaaababbaaa
12 aaaababbaaaa
13 aaaababbaabab
14 aaaababbaababb
15 aaaababbaababba
16 aaaababbaababbaa
17 aaaababbaababbaaa
18 aaaababbaababbaaaa
19 aaaababbaababbaabab
20 aaaababbaababbaababb


3.n>=3,abcabc…… 不存在回文且字典序最小
#include <cstring>
#include <cstdio>
#include <iostream>
using namespace std;

/*
int len;
string ans;

int cal( string str){
    int length = str.length();
    int tmp = 0;
    for(int i = 0; i < length; i ++ ){
        for(int j = length - 1; j >= i; j--){
            int tmp_i = i;
            int tmp_j = j;
            while(tmp_i <= tmp_j && str[tmp_i] == str[tmp_j]){
                tmp_i ++;
                tmp_j --;
            }
            if(tmp_i > tmp_j){
                int tt = j - i + 1;
                tmp = ( tt > tmp ) ? tt : tmp;
            }
        }
    }
    return tmp;
}                    

void getString( int level, int total, string str){
    if(level == total ){
        int tmp = cal(str);    
        if( (tmp < len) || (tmp == len && str < ans) ){
            len = tmp;
            ans = str;
        }
    }
    else{
        getString( level + 1, total, str + "a" );
        getString( level + 1, total, str + "b" );
    }
}
                
void dabiao(){
    for(int i = 1;i <= 20; i ++){
         len = i;
         ans = "";
         for(int j = 0; j < i; j++){
             ans += 'b';
         }
         getString(0,i,"");
         cout << i << " " << ans << endl; 
     }
 }
*/

int n,m,t;
             
int main(){
    //dabiao();
    scanf("%d",&t);
    for(int i = 1; i <= t; i++){
        scanf("%d%d",&m,&n);
        printf( "Case #%d: ", i );
        if( m == 1 ){
            for(int j = 0; j < n; j ++){
                printf( "a" );
            }
            printf("\n");
        }
        else if( m >= 3 ){
            for(int j = 0; j < n / 3; j ++){
                printf( "abc" );
            }
            if( n % 3 == 1 ){
                printf("a\n");
            }
            else if( n % 3 == 2 ){
                printf("ab\n");
            }
            else printf("\n");
        }
        else if( m == 2 ) {
            if(  n == 1 ) printf( "a\n" );
            else if( n == 2 ) printf( "ab\n");
            else if( n == 3 ) printf("aab\n");
            else if( n == 4 ) printf("aabb\n");
            else if( n == 5 ) printf("aaaba\n");
            else if( n == 6 ) printf("aaabab\n");
            else if( n == 7 ) printf("aaababb\n");
            else if( n == 8 ) printf("aaababbb\n");
            else{
                printf("aaaa");
                n -= 4;
                for( int j = 0; j < n / 6 ; j ++ ){
                    printf("babbaa");
                }
                if(n % 6 == 1 ) printf("a\n");
                else if( n % 6 == 2 ) printf("aa\n");
                else if( n % 6 == 3 ) printf("bab\n");
                else if( n % 6 == 4 ) printf("babb\n");
                else if( n % 6 == 5 ) printf("babba\n");
                else printf("\n");
            }      
        }
    }                             
    
    //system( "pause" );
    
    return 0;
}    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值