1. 程式人生 > >LC和加瑪帝國的公主

LC和加瑪帝國的公主

數據 描述 緣分 ted bsp 2015年 輸出 hover min

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和加瑪帝國的公主