時間限制:1000ms
單點時限:1000ms
記憶體限制:64mb
小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。
這一天,他們遇到了一連串的字串,於是小hi就向小ho提出了那個經典的問題:「小ho,你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?」
小ho奇怪的問道:「什麼叫做最長回文子串呢?」
小hi回答道:「乙個字串中連續的一段就是這個字串的子串,而回文串指的是12421這種從前往後讀和從後往前讀一模一樣的字串,所以最長回文子串的意思就是這個字串中最長的身為回文串的子串啦~」
小ho道:「原來如此!那麼我該怎麼得到這些字串呢?我又應該怎麼告訴你我所計算出的最長回文子串呢?
小hi笑著說道:「這個很容易啦,你只需要寫乙個程式,先從標準輸入讀取乙個整數n(n<=30),代表我給你的字串的個數,然後接下來的就是我要給你的那n個字串(字串長度<=10^6)啦。而你要告訴我你的答案的話,只要將你計算出的最長回文子串的長度按照我給你的順序依次輸出到標準輸出就可以了!你看這就是乙個例子。」
提示一提示二
提示三提示四
樣例輸入
3樣例輸出abababa
aaaabaa
acacdas
753hint:就是給你乙個字串,問你這個字串的最長回文子串的長度是多少。。。
感覺自己又學到了新技能。。。因為處理回文字串的時候,奇數比偶數處理起來更簡單一點,所以我們用乙個技巧,在字元的前後加上'#'
求回文串,一般人是列舉。。。但是考慮到資料量的問題,可能會超時,所以換一種方法,把每個字元當做回文串的中點去判斷,又因為當所有的字元都相同的時候,這個演算法會退化得非常慢,所以我們
想辦法,發現利用前面求得的資訊,我們在之後求回文串的時候可以省事不少----我們儲存當前已經求得的最遠回文串以及該回文串的中點,然後判斷當前要求的這個位置和最遠點的關係和該點的對稱點
的回文串長度之間的關係,// 這個鏈結裡面我覺得講得非常好了。。。。可以觀摩學習一波
1 #include2 #include3 #include4 #include5 #include6
using
namespace
std;
7const
int n = 1
<<23;8
char
s[n], str[n];
9int
a[n];
1011
//最長回文子串的一篇文章,講得可以說是非常好了
12int
main()
24int mx=0
, re;
25for(int i=1; i)33}
34int ans=1;35
for(int i=1; i1
);36 printf("
%d\n
", ans);37}
3839
return0;
40 }
hiho一下第一周 最長回文子串
類似於kmp的思想,利用已經匹配的資訊計算未匹配的資訊。基本原理就是 我們將f i 定義為以i為中心的最長回文串長度。那麼如果有f 5 7,f 4 3,那麼我們可以得到f 6 3.以此來減少比較次數。當然還有一些細節要處理。比如回文串長度的奇偶性。這個是我自己寫的版本,不是很精簡。include i...
hiho一下第一周 最長回文子串
時間限制 1000ms 單點時限 1000ms 記憶體限制 256mb 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一連串的字串,於是小hi 就向小ho 提出了那個經典的問題 小ho 你能不能分別...
hiho一下 第一周
題目名稱 最長回文子串 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一連串的字串,於是小hi 就向小ho 提出了那個經典的問題 小ho 你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?小h...