題目名稱:
最長回文子串
小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。
這一天,他們遇到了一連串的字串,於是小hi
就向小ho
提出了那個經典的問題:「小ho
,你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?」
小ho奇怪的問道:「什麼叫做最長回文子串呢?」
小hi回答道:「乙個字串中連續的一段就是這個字串的子串,而回文串指的是12421這種從前往後讀和從後往前讀一模一樣的字串,所以最長回文子串的意思就是這個字串中最長的身為回文串的子串啦~」
小ho道:「原來如此!那麼我該怎麼得到這些字串呢?我又應該怎麼告訴你我所計算出的最長回文子串呢?
小hi笑著說道:「這個很容易啦,你只需要寫乙個程式,先從標準輸入讀取乙個整數n(n<=30),代表我給你的字串的個數,然後接下來的就是我要給你的那n個字串(字串長度<=10^6)啦。而你要告訴我你的答案的話,只要將你計算出的最長回文子串的長度按照我給你的順序依次輸出到標準輸出就可以了!你看這就是乙個例子。」
提示一提示二
提示三提示四
樣例輸入
3abababa
aaaabaa
acacdas
樣例輸出
753
思路;看原題提示,用manacher演算法,可以直接模板,不過建議理解,其實挺好玩的
**如下:
#include#include#include#include#includeusing namespace std;
const int maxn=1000005;
char str[maxn]; //原字串
char tmp[maxn<<1]; //轉換後的字串
int len[maxn<<1];
int init(char* st)
tmp[2*len+1]='#';
tmp[2*len+2]='$'; //字串結尾加乙個字元,防止越界,注意不要再次用'@'
return 2*len+1; //返回轉換字串的長度
}int manacher(char* st,int len)
ans=max(ans,len[i]);
}return ans-1;//返回len[i]中的最大值-1即為原串的最長回文子串額長度
}int main()
}return 0;
}
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一下 第一周(最長回文子串)
時間限制 1000ms 單點時限 1000ms 記憶體限制 64mb 小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一連串的字串,於是小hi就向小ho提出了那個經典的問題 小ho,你能不能分別在這些...