HDU 4731 Minimum palindrome 2013 ACM/ICPC 成都网络赛
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4731
题解:规律题,我们可以发现当m大于等于3时,abcabcabc……这个串的回文为1,并且字典数最小,
m等以1时,直接输出n个a,
现在要解决的就是m=2的情况:
通过自己再纸上面写可以得出当n大于等于9时,最大的回文为4,要字典数最小,所以前四个都为a,后面也可以找到一个最小循环结:babbaa
但是还要讨论最后还剩余几个,如果是小于等于两个,那么添加2个a,否则按循环结添加。
AC代码:
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cstdlib>#include <cmath>#include <vector>#include <list>#include <deque>#include <queue>#include <iterator>#include <stack>#include <map>#include <set>#include <algorithm>#include <cctype>using namespace std;typedef __int64 xiaohao;typedef long long LL;const int N=100090;const int INF=0x3f3f3f3f;const double PI=acos(-1.0);const double eps=1e-7;const char tab[8][20] ={ "a", "ab", "aab", "aabb", "aaaba", "aaabab", "aaababb", "aaababbb"};int main(){ int T,se=0; scanf("%d",&T); while(T--) { int m, n; scanf("%d%d",&m,&n); printf("Case #%d: ", ++se); if(m>2) { int a = n / 3; int b = n % 3; for(int i=0;i<a;i++) printf("abc"); for(int i=0;i<b;i++) printf("%c",'a'+i); printf("\n"); } else if(m == 1) { for(int i=0;i<n;i++) putchar('a'); printf("\n"); } else { if(n < 9) { printf("%s\n", tab[n-1]); } else { char t[] = "babbaa"; printf("aaaa"); int a = (n-4) / 6; int b = (n-4) % 6; for(int i=0;i<a;i++) printf("babbaa"); if(b <= 2) for(int i=0;i<b;i++) putchar('a'); else for(int i=0;i<b;i++) putchar(t[i]); printf("\n"); } } } return 0;}