数学题(找规律)-hdu-4371-Minimum palindrome
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4731
题目大意:
给一个n表示有n种字母(全部小写),给一个m,求一个由不超过n种字母组成的m个小写字母的串S,使得S在所有的满足要求的串中最长的回文子串长度最短。
解题思路:
显然当n>=3时肯定是abcabc这样构造。
当n=1时为aaaaaa...
当n=2时,打表可以发现规律。当m>=9时,都满足开始为aaaa,后面为以babbaa作为循环节的串。
打表截图:

压缩暴力打表代码:
#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<set>#include<stack>#include<list>#include<queue>#include<ctime>#define eps 1e-6#define INF 0x3fffffff#define PI acos(-1.0)#define ll __int64#define lson l,m,(rt<<1)#define rson m+1,r,(rt<<1)|1#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;char temp[10][10]={"","a","ab","aab","aabb","aaaba","aaabab","aaababb","aaababbb"};char ba[7]="babbaa";int main(){ int t,n,m; scanf("%d",&t); for(int ca=1;ca<=t;ca++) { scanf("%d%d",&n,&m); printf("Case #%d: ",ca); if(m<=n) { for(int i=0;i<m;i++) putchar('a'+i); } else { if(n==1) { for(int i=0;i<m;i++) putchar('a'); } else if(n>=3) { for(int i=0;i<m;i++) { int j=i%3; putchar('a'+j); } } else { if(m<=8) { printf("%s\n",temp[m]); continue; } printf("aaaa"); m-=4; int num=m/6; for(int i=1;i<=num;i++) printf("%s",ba); m-=num*6; for(int i=0;i<m;i++) putchar(ba[i]); } } putchar('\n'); } return 0;}