經典演算法 最長回文子串

2021-07-10 22:01:16 字數 1588 閱讀 2245

時間限制:

1000ms

單點時限:

1000ms

記憶體限制:

64mb

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

這一天,他們遇到了一連串的字串,於是小hi

就向小ho

提出了那個經典的問題:「小ho

,你能不能分別在這些字串中找到它們每乙個的最長回文子串呢?」

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

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

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

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

提示一提示二

提示三提示四

樣例輸入

3

abababa

aaaabaa

acacdas

樣例輸出

#include#include#include//cin>>輸入字串必須新增的標頭檔案

#include//c++中使用memset必須新增的標頭檔案

#include#includeusing namespace std;

const int n = 2 * (1e6) + 3;

char s[n];

int p[n];

//利用manacher演算法求最長回文子串

void manacher(char* s, int len) }}

int main()

for (int k = 0; k < n; ++k)

for (int i = len; i >= 0; i--)

s[0] = '*'; //防止陣列越界

len = len * 2 + 2;

manacher(s, len);

int ans = 0;

for (int i = 0; i < len; i++)

ans = max(ans, p[i] - 1);

printf("%d\n", ans);

} return 0;

}}

演算法 最長回文子串

題目描述 對於乙個字串,請設計乙個高效演算法,計算其中最長回文子串的長度。給定字串a以及它的長度n,請返回最長回文子串的長度。例如 輸入 abc1234321ab 12 返回值 7 最長回文子串 public static intgetlongestpalindrome string a,int n...

演算法競賽入門經典 3 3 最長回文子串

例題3 4 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串中連續出現的字串片段。回文的含義是 正看著和倒看著相同,如abba和yyxyy。在判斷時,應該忽略所有標點符號和空格 且忽略大小寫,但輸出應保持原樣 在回文串的首部和尾部不要輸出多餘字元 輸入字元長度不超過5000 且佔據單獨的一...

最長回文串 演算法 4 求解最長回文子串

問題描述 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。注釋 回文通俗的說就是正著念和反著念都一樣,如 上海自來水來自海上。示例 1 輸入 dabccbac 輸出 abccba 示例 2 輸入 cbbd 輸出 bb 解題思路 此處撰寫解題思路 遍歷每乙個索引,...