時間限制:
1000ms
單點時限:
1000ms
記憶體限制:
64mb
小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。
這一天,他們遇到了一連串的字串,於是小hi
就向小ho
提出了那個經典的問題:「小ho
,你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?」
小ho奇怪的問道:「什麼叫做最長回文子串呢?」
小hi回答道:「乙個字串中連續的一段就是這個字串的子串,而回文串指的是12421這種從前往後讀和從後往前讀一模一樣的字串,所以最長回文子串的意思就是這個字串中最長的身為回文串的子串啦~」
小ho道:「原來如此!那麼我該怎麼得到這些字串呢?我又應該怎麼告訴你我所計算出的最長回文子串呢?
小hi笑著說道:「這個很容易啦,你只需要寫乙個程式,先從標準輸入讀取乙個整數n(n<=30),代表我給你的字串的個數,然後接下來的就是我要給你的那n個字串(字串長度<=10^6)啦。而你要告訴我你的答案的話,只要將你計算出的最長回文子串的長度按照我給你的順序依次輸出到標準輸出就可以了!你看這就是乙個例子。」
提示一提示二提示三
提示四
樣例輸入
3abababa
aaaabaa
acacdas
樣例輸出
753
經典例題,解法參考原**
f[i]
表示以第
i個字元為中心的最長回文子串的長度,_max表示以j為中心的最右邊界。
#include #include #include #include #include #include #include #include #include #include using namespace std;
const int n=1<<23;
char s[n];
char str[n];
int f[n];
int main()
else
f[i]=1;
int nnn=f[i]/2+1;
while(str[i-nnn]==str[i+nnn])
f[i]=2*nnn-1;
if(f[i]/2+i>_max)
}int ans=0;
for(int i=1;iprintf("%d\n",ans/2);
}}
hihoCoder 1032 最長回文子串
求最長回文子串的演算法比較經典的是manacher演算法,下面寫寫自己的理解。文中用到的來自這裡,博主寫的很好,由於為了和 一致,我稍微p了一下。首先,說明一下用到的陣列和其他引數的含義 1 以字串中下標為 例如 字串 所以,陣列 2 為當前已確定的邊界能伸展到最靠右的回文串的中心。例如 設黑色的線...
hihoCoder 1032 最長回文子串
求最長回文串的長度,一道模板題,如果大家有誰不懂這個演算法,可以到這個部落格上看一下,我感覺寫的非常好,仔細看一定能看懂。manacher演算法 include include include include using namespace std const int maxn 1000005 ch...
HihoCoder 1032 最長回文子串
華電北風吹 天津大學認知計算與應用重點實驗室 2016 06 23 題目分析 首先需要注意的是 子串 和 子串行 問題還有很多變形,如最長公共子串 子串行 最長回文子串 回文子串行 等。problem1032.cpp 定義控制台應用程式的入口點。最長回文子串 張正義 2016 04 12 inclu...