回文串 馬拉車(模板)

2021-10-02 16:59:00 字數 1214 閱讀 8337

給出乙個只由小寫英文本元a,b,c…y,z組成的字串s,求s中最長回文串的長度.

回文就是正反讀都是一樣的字串,如aba, abba等

input

輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c...y,z組成的字串s

兩組case之間由空行隔開(該空行不用處理)

字串長度len <= 110000

output

每一行乙個整數x,對應一組case,表示該組case的字串中所包含的最長回文長度.

對於字串的每乙個點,分別左右遍歷判斷是否滿足str[i-t]==str[i+t];

這種方法時間複雜度太高,為n^2。

設定變數:mx(當前位置時到達最右邊的回文串位置),len[i]陣列(記錄當前回文串長度)id(當前最長回文串的中點位置);

manacher演算法與暴力演算法不同之處是利用回文串的特性即左右對稱,做了乙個預處理;

len[i]=min(mx-i,len[2*id-i]);

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int n=

223456

;char str[n]

,s[n]

;int len[n]

;int k;

void

get_s

(char s)

//將字串預處理,消除奇數串或偶串的影響,填充與字串不同的字元;

str[k]=0

;}intmanachar

(char str)

else len[i]=1

;//當mx<=i時,len[i]=1;

while

(str[i+len[i]

]==str[i-len[i]])

++len[i]

;//拓展len[i]的長度,與暴力時一樣;

if(len[i]

+i>mx)

}return

(maxx-1)

;}intmain()

return0;

}

HDU 3068 最長回文(馬拉車模板題)

給出乙個只由小寫英文本元a,b,c y,z組成的字串s,求s中最長回文串的長度.回文就是正反讀都是一樣的字串,如aba,abba等 input 輸入有多組case,不超過120組,每組輸入為一行小寫英文本元a,b,c y,z組成的字串s 兩組case之間由空行隔開 該空行不用處理 字串長度len 1...

HDU 3086 馬拉車模板

模板,但是對這個演算法還是不太清楚,真實不明覺厲.1 include 2 include 3 include 4 pragma warning disable 4996 5using namespace std 67 inline int max int a,int b 8 inline int m...

leetcode 回文字串(馬拉車演算法模板)

由於看了乙個巨巨的部落格深受啟發。所以不再贅述。巨巨的部落格 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 看懂馬拉車即可 class soluti...