LC和加瑪帝國的公主
阿新 • • 發佈:2017-09-02
數據 描述 緣分 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 namespacestd; 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和加瑪帝國的公主