hdu3068最長回文 Manacher演算法

2022-02-06 18:53:26 字數 1386 閱讀 4536

簡單來說這是個很水的東西。有點dp的思想吧。推薦兩個部落格,很詳細。

然後以為隨便學點然後去複習,結果……呵呵。什麼鬼資料,兩行之間用空行隔開……沒看到一直wa半節課……

hdu3068最長回文

var

s1,s2:ansistring;

s:array[0..1000000]of

char;

p:array[0..1000000]of

longint;

max,ans,mid,i,len:longint;

ch:char;

flag:boolean;

function

min(x,y:longint):longint;

begin

if xthen min:=x

else min:=y;

end;

begin

while

not eof do

begin

readln(s1);

readln(s2);

len:=length(s1);

fillchar(p,sizeof(p),0);

s[0]:='$'

; s[

1]:='#'

;

for i:=1

to len do

begin

s[i*2]:=s1[i];

s[i*2+1]:='#'

;

end;

len:=len*2+2

; s[len]:='#'

; mid:=0

; max:=0

; ans:=1

;

for i:=1

to len do

begin

if max>i then

p[i]:=min(p[mid*2-i],max-i)

else p[i]:=1

;

while s[i+p[i]]=s[i-p[i]] do

inc(p[i]);

if p[i]+i>max then

begin

max:=p[i]+i;

mid:=i;

end;

if ansthen ans:=p[i];

end;

writeln(ans-1

);

end;

end.

view code

簡單來說就是判斷是否被前面的覆蓋到,如果有,根據對稱性可以可得乙個長度(min=(p[mid<<1-i],max-i)),如果沒有就長度為1,然後再根據這個長度擴充套件,順便更新下最大值。

這渣狀態……!!

HDU 3068 最長回文

題 目 鏈 接 看完後自己寫了一遍,感覺真的是很神奇的結論啊!本來這題看到可以用字尾陣列來寫的,但沒有學過,去看了一下,真心給暈了,決定找個機會認真研究下。我的 include include includeusing namespace std define min a,b a b a b cha...

HDU 3068 最長回文

存在o n 的演算法,學習了一下 include include includeusing namespace std const int maxn 300011 int n,p maxn char str maxn in maxn int main str 0 str 1 n n 2 2 str ...

HDU 3068 最長回文

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