hdu4731Minimum palindrome 构造

//给出n和m
//用m个小写字母,构成长度为n的序列
//这个序列的最长的回文子串长度要最小,如果存在多个
//就输出字典序最小的
//对于三个字母以上的很容易发现是"abcabcabc..."
//对于一个字母的很明显
//对于两个字母的小于等于8的需要特判一下
//对于大于8的可以"aababb"一直循环下去,这样的最长回文子串的长度一直是4
//然后就是由于需要字典序最小 , 所以需要先输出两个"aa"
#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
using namespace std ;
const int maxn = 1e5+10 ;
string str[10] ;
string s ;
string ss  ;
void init()
{
    str[1] = "a" ;
    str[2] = "ab" ;
    str[3] = "aab" ;
    str[4] = "aabb" ;
    str[5] = "aaaba" ;
    str[6] = "aaabab" ;
    str[7]=  "aaababb" ;
    str[8] = "aaababbb" ;
    int len = 0 ;
    s = "aa" ;
    string tmp = "aababb" ;
    while(s.length() < maxn - 6)
    s += tmp ;
    string tt = "abc" ;
    while(ss.length() < maxn - 3)
    ss += tt ;
}
int main()
{
    int n , m  ;
    int t  ;
    init() ;
    scanf("%d" , &t) ;
    int cas = 0 ;
    while(t--)
    {
        scanf("%d%d" , &n , &m) ;
        printf("Case #%d: " , ++cas) ;
        if(n == 1)
        while(m--)
        printf("a") ;
        else if(n == 2)
        {
            if(m <= 8)
            for(int i = 0;i < m;i++)
            cout<<str[m][i] ;
            else
            for(int i = 0 ; i < m;i++)
            cout<<s[i];
        }
        else
          for(int i = 0 ;i < m;i++)
          cout<<ss[i];
        puts("") ;
    }
}

































你可能感兴趣的:(hdu4731Minimum palindrome 构造)