HDU 4371 Minimum palindrome 解题报告(找规律)
2013-09-15 20:21
260 查看
昨天没想出来,额,自己太水了。写个博客记录下。
题目大意:给定字母数量和字符串长度,求组成的字符串中最长的回文子串最短的字符串。= =
首先,长度可能是10W,所以可以排除是DP或者暴力什么的。
一个很容易找到的规律是,如果给定的字母数大于等于3的话,那么所求的字符串一定是类似于abcabcabc……这种格式。
首先回文子串的长度是1,而且字典序最小。因为找不到字典序更小的,所以该串即为所求。
当字母数是1时,也很简单,一串a即可。
当字母数是2时最难处理,昨天也是卡在这个地方。
写下字母数是2,长度由1-10可以帮助我们思考。如下:
1. a
2. ab
3. aab
4. aabb
5. aaabb
6. aababb
7. aaababb
8. aaababbb
9. aaaababba
10. aaaababbaa
容易发现的是当长度大于9时,回文子串的长度已经达到4了,不可能小于4。
基本在这里可以找到答案。后来的串按照aababb循环,可以保证回文长度一直是4。而且我们找不到字典序更小的,可以确定这就是答案。
之前的abc循环已经算是提示了,只不过找到aababb这样的循环串感觉还是挺难的,昨天就没有想到这一点。
贴个代码:
题目大意:给定字母数量和字符串长度,求组成的字符串中最长的回文子串最短的字符串。= =
首先,长度可能是10W,所以可以排除是DP或者暴力什么的。
一个很容易找到的规律是,如果给定的字母数大于等于3的话,那么所求的字符串一定是类似于abcabcabc……这种格式。
首先回文子串的长度是1,而且字典序最小。因为找不到字典序更小的,所以该串即为所求。
当字母数是1时,也很简单,一串a即可。
当字母数是2时最难处理,昨天也是卡在这个地方。
写下字母数是2,长度由1-10可以帮助我们思考。如下:
1. a
2. ab
3. aab
4. aabb
5. aaabb
6. aababb
7. aaababb
8. aaababbb
9. aaaababba
10. aaaababbaa
容易发现的是当长度大于9时,回文子串的长度已经达到4了,不可能小于4。
基本在这里可以找到答案。后来的串按照aababb循环,可以保证回文长度一直是4。而且我们找不到字典序更小的,可以确定这就是答案。
之前的abc循环已经算是提示了,只不过找到aababb这样的循环串感觉还是挺难的,昨天就没有想到这一点。
贴个代码:
#include <iostream> using namespace std; #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <string> #include <deque> #include <queue> #include <cmath> #include <set> #define LL long long char s1[] = "aababb"; char s2[] = "abc"; int main() { int T; scanf("%d",&T); for(int cas = 1; cas<=T;cas++) { int n,m; scanf("%d%d",&n,&m); printf("Case #%d: ",cas); if(n == 1) { while(m--) printf("a"); } else if(n == 2) { if(m==1) printf("a"); else if(m==2) printf("ab"); else if(m==3) printf("aab"); else if(m==4) printf("aabb"); else if(m==5) printf("aaaba"); else if(m==6) printf("aaabab"); else if(m==7) printf("aaababb"); else if(m==8) printf("aaababbb"); else { int time = (m-2)/6; printf("aa"); while(time--) printf("aababb"); time = (m-2)%6; for(int i=0;i<time;i++) printf("%c",s1[i]); } } else { int time = m/3; while(time--) printf("abc"); time = m%3; for(int i=0;i<time;i++) printf("%c",s2[i]); } puts(""); } }
相关文章推荐
- 解题报告:HDU_6189 Law of Commutation (找规律)
- HDU 4919 Exclusive or 解题报告(规律+大数)
- Hdu 2053 Switch Game 推结论? 找规律?解题报告
- 解题报告:HDU_6129 Just do it (找规律 两种做法)
- hdu 1233 还是畅通工程 解题报告
- Hdu 2099之解题报告
- 杭电acm2091 hdu-acm-2091空心三角形解题报告
- hdu 1010 Tempter of the Bone 解题报告
- HDU 2089 数位DP 解题报告
- Hdu 1512 Monkey King 左偏树 解题报告
- HDU 4770 Lights Against Dudely 解题报告
- hdu1978 How many ways 解题报告
- HDU 4709 Herding 解题报告
- HDU 4607 Park Visit 解题报告
- HDU 5445 Food Problem 解题报告(背包)
- LuoguP1720 月落乌啼算钱 解题报告【模拟+找规律/数学】
- HDU 1050解题报告
- HDU 3342 解题报告
- HDU 4614 Vases and Flowers 解题报告
- HDU1561 The more, The Better 解题报告【树上DP/背包】