标签:算法 没有 clip 输出 char 数据 clipboard abc 回文
发布时间: 2015年9月19日 21:42 时间限制: 1000ms 内存限制: 256M
有一天, 我们帅气的LC来到加玛帝国. 有时候, 缘分就是这么奇怪, LC和加玛帝国的公主一见钟情, 奈何公主的父王不同意, 因为他觉得LC除了长得特别帅之外, 并没有一技之长.
LC对此呵呵一笑, 他说, 我可是创新实验室走出来的学生, 我会的技能可多着呢, 先说个简单的吧, 只要你给我任意一串字符串, 我就能立马算出这串字符串当中最长回文串的长度. 国王很是吃惊, 说要考一考LC.
于是国王想让你帮忙写一个程序, 用来比对LC的答案, 快来帮帮国王吧!
第一行输入一个T(T <= 50), 表示一共有T组测试数据.
接下来T行, 每行为一组由小写字母组成, 长度不超过10^5的字符串.
每行一个整数X, 表示该组字符串中所包含的最长回文长度.
3 aba abc aabaa
3
1 5
就是一个最简单的回文串问题,套用马拉车算法即可。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int mxn = 200015; 9 10 int cas, n, m; 11 12 char str[mxn]; 13 char dob[mxn]; 14 15 int rid[mxn]; 16 17 signed main() { 18 for (scanf("%d", &cas); cas--; ) { 19 int mx = 0, id = 0, ans = 0; 20 scanf("%s", str + 1); 21 n = strlen(str + 1); 22 dob[m = 1] = ‘#‘; 23 for (int i = 1; i <= n; ++i) { 24 dob[++m] = str[i]; 25 dob[++m] = ‘$‘; 26 } 27 for (int i = 1; i <= m; ++i) { 28 if (mx >= i) 29 rid[i] = min(mx - i + 1, rid[2 * id - i]); 30 else 31 rid[i] = 1; 32 while (dob[i - rid[i]] == dob[i + rid[i]]) 33 ++rid[i]; 34 if (mx < i + rid[i] - 1) 35 mx = i + rid[i] - 1, id = i; 36 if (i & 1) 37 ans = max(ans, rid[i] - rid[i] % 2); 38 else 39 ans = max(ans, rid[i] - (rid[i] + 1) % 2); 40 } 41 printf("%d\n", ans); 42 } 43 }
标签:算法 没有 clip 输出 char 数据 clipboard abc 回文
原文地址:http://www.cnblogs.com/kenro/p/7465341.html