時間限制:
1000ms
單點時限:
1000ms
記憶體限制:
256mb
小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。
這一天,他們遇到了一連串的字串,於是小hi
就向小ho
提出了那個經典的問題:「小ho
,你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?」
小ho奇怪的問道:「什麼叫做最長回文子串呢?」
小hi回答道:「乙個字串中連續的一段就是這個字串的子串,而回文串指的是12421這種從前往後讀和從後往前讀一模一樣的字串,所以最長回文子串的意思就是這個字串中最長的身為回文串的子串啦~」
小ho道:「原來如此!那麼我該怎麼得到這些字串呢?我又應該怎麼告訴你我所計算出的最長回文子串呢?
小hi笑著說道:「這個很容易啦,你只需要寫乙個程式,先從標準輸入讀取乙個整數n(n<=30),代表我給你的字串的個數,然後接下來的就是我要給你的那n個字串(字串長度<=10^6)啦。而你要告訴我你的答案的話,只要將你計算出的最長回文子串的長度按照我給你的順序依次輸出到標準輸出就可以了!你看這就是乙個例子。」
樣例輸入
3樣例輸出abababa
aaaabaa
acacdas
7求最長回文子串,我們從字串第乙個字元開始,以他為中心,向兩邊擴散,比較兩邊字元是否相等,相等則記錄下來,繼續向兩邊擴充套件;不相等,記下當前長度,更換中心字元,依次類推,直到遍歷完整個字串,輸出當前值,即為最長回文子串的長度。53
這裡我除錯的時候發現乙個問題,即c++中陣列下標可以是負值。這樣的話有些細節就需要注意。calcul()函式中的下面這幾行
while(p[s-1] == p[e+1] && s > 0)
中的 s>0 必須要加,讀者可以試試把這個約束條件去掉,第乙個示例會出現什麼樣的結果。如果不加,則會出現乙個比示例長度還大的最大回文子串。這是怎麼回事呢,經過除錯我們可以很明顯的看到,指示下標 s 多次指向負下標的陣列值,導致使回文子串變大。
#include #include using namespace std;
int n; //用例個數
char str[100000]; //定義乙個字元陣列
int calcul(char *p)
if((t = e - s + 1) > ans) //如果回文長度大於當前大小,則記錄
hiho一下第一周 最長回文子串
類似於kmp的思想,利用已經匹配的資訊計算未匹配的資訊。基本原理就是 我們將f i 定義為以i為中心的最長回文串長度。那麼如果有f 5 7,f 4 3,那麼我們可以得到f 6 3.以此來減少比較次數。當然還有一些細節要處理。比如回文串長度的奇偶性。這個是我自己寫的版本,不是很精簡。include i...
hiho一下 第一周(最長回文子串)
時間限制 1000ms 單點時限 1000ms 記憶體限制 64mb 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一連串的字串,於是小hi就向小ho提出了那個經典的問題 小ho,你能不能分別在這些...
hiho一下 第一周
題目名稱 最長回文子串 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一連串的字串,於是小hi 就向小ho 提出了那個經典的問題 小ho 你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?小h...