码迷,mamicode.com
首页 > 其他好文 > 详细

LC和加玛帝国的公主

时间:2017-09-02 00:16:37      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:算法   没有   clip   输出   char   数据   clipboard   abc   回文   

LC和加玛帝国的公主

发布时间: 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 }

 

LC和加玛帝国的公主

标签:算法   没有   clip   输出   char   数据   clipboard   abc   回文   

原文地址:http://www.cnblogs.com/kenro/p/7465341.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!