hdu 4371 Minimum palindrome(13年成都网络赛D题)(找规律)

来源:互联网 发布:aso优化技巧 编辑:程序博客网 时间:2024/05/18 01:25

题意:让你使用小写字母表的前m个字母,然后组成一个长度为n的字符串,使其字符串的最大回文串的长度是所有构成长度为n串的最大回文串长度的最小值。输出字典序最小的串。

思路:当m==1 的时候,只能使用a ,那么a 循环即可。当 m>2时,此时使用三个数字典序最小,即使用abc循环即可。而m==2时,需要暴力打表找规律。通过打表发现,当n>8的时候前两位为aa,后面则是aababb循环。而小于8时特判。

暴力表用二进制表示,1表示b,0表示a,如下所示:(n<=20)

0
01
001
0011
00010
000101
0001011
00010111
000010110
0000101100
00001011000
000010110000
0000101100101
00001011001011
000010110010110
0000101100101100
00001011001011000
000010110010110000
0000101100101100101
00001011001011001011

代码如下:

#include <iostream>#include <cstdio>using namespace std;int n,m;char a[8]="aababb";int main(){ //   freopen("in.txt","r",stdin);    int t;    scanf("%d",&t);    int cas=1;    while(t--)    {        printf("Case #%d: ",cas++);        scanf("%d%d",&m,&n);        if(m==1)        {            for(int i=0;i<n;i++)            {                printf("a");            }            printf("\n");        }        else if(m==2)        {            if(n==1) printf("a\n");            if(n==2) printf("ab\n");            if(n==3) printf("aab\n");            if(n==4) printf("aabb\n");            if(n==5) printf("aaaba\n");            if(n==6) printf("aaabab\n");            if(n==7) printf("aaababb\n");            if(n==8) printf("aaababbb\n");            if(n>8)            {                printf("aa");                n=n-2;                int tmp=n/6;                for(int i=0;i<tmp;i++)                {                    printf("%s",a);                }                tmp=n%6;                for(int i=0;i<tmp;i++)                {                    printf("%c",a[i]);                }                printf("\n");            }        }        else        {            for(int i=0;i<n;i++)            {                if(i%3==0) printf("a");                if(i%3==1) printf("b");                if(i%3==2) printf("c");            }            printf("\n");        }    }    return 0;}