給出乙個只由小寫英文本元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...