hihoCoder 1032 最長回文子串

2021-08-07 05:07:46 字數 1738 閱讀 1766

這就是最典型的manacher演算法題,聽起來高大上,而且也很難說清楚,但是實際上並不難,就相當於數學的推理,推出乙個公式即可直接解出。

題目如下:

時間限制:1000ms 單點時限:1000ms 記憶體限制:64mb 描述

小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。

這一天,他們遇到了一連串的字串,於是小hi就向小ho提出了那個經典的問題:「小ho,你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?」

小ho奇怪的問道:「什麼叫做最長回文子串呢?」

小hi回答道:「乙個字串中連續的一段就是這個字串的子串,而回文串指的是12421這種從前往後讀和從後往前讀一模一樣的字串,所以最長回文子串的意思就是這個字串中最長的身為回文串的子串啦~」

小ho道:「原來如此!那麼我該怎麼得到這些字串呢?我又應該怎麼告訴你我所計算出的最長回文子串呢?

小hi笑著說道:「這個很容易啦,你只需要寫乙個程式,先從標準輸入讀取乙個整數n(n<=30),代表我給你的字串的個數,然後接下來的就是我要給你的那n個字串(字串長度<=10^6)啦。而你要告訴我你的答案的話,只要將你計算出的最長回文子串的長度按照我給你的順序依次輸出到標準輸出就可以了!你看這就是乙個例子。」

樣例輸入

3

abababa

aaaabaa

acacdas

樣例輸出

7

53

manacher的詳細演算法思路可以見:

思路他已經講的很詳細就不重複複述了,就講一下自己遇到的坑

在第三種情況下,i-k回文串的左邊與i回文串左邊重合,那麼就讓p[i+k]=p[i-k]

這是沒問題的,但是,如果插入了特殊字元之後,那就不能這麼寫了。

我一開始寫的是

if(p[id]+id == i)
然後就wa了,一直覺得自己沒錯,對比一下ac**,發現我只多了這一句,經過推敲發現,這一句確實是多餘的,如果一定要加上,那麼也該是如下,因為兩端都加上了特殊字元。

if(p[id]+id-2 == i)
下面放上ac**:

#include

#include

#include

#include

using namespace std;

const

int max = 1000005;

char arr[max*2];

int p[max*2];

int main()

//arr[len*2+2]='@';

arr[0] = '$';

//長度是從1-2*i+1,設定第乙個和最後乙個不同,是讓下面的hile迴圈正常執行不越界

intid=0;

int maxlen=0;

for(int i=2;i2+1;i++)else

if(p[id]+id-2 == i)else

while(arr[i-p[i]] == arr[i+p[i]])

if(p[i]+i > p[id]+id)

if(p[i] > maxlen)

}cout<1

0;}

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...