HDU3068 最長回文

2021-07-10 18:47:38 字數 1391 閱讀 3454

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

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

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

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

字串長度len <= 110000

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

aaaa

abab

4

3

2009 multi-university training contest 16 - host by nit

manacher演算法求最長回文。

**如下:

var ans:longint;

s:ansistring;

p:array[0..300050] of longint;

st:array[0..300050] of char;

function

min(x,y:longint):longint; begin

if xthen

exit(x) else

exit(y); end;

procedure

work

();var i,mx,id,l:longint;

begin

for i:=1

to length(s) do

begin

st[i*2-1]:='#'; st[i*2]:=s[i];

end; l:=length(s)*2+1;

st[0]:='&'; st[l]:='#'; st[l+1]:='%';

mx:=0;

for i:=1

to l do

begin

if mx>i then p[i]:=min(p[2*id-i],mx-i) else p[i]:=1;

while st[i+p[i]]=st[i-p[i]] do inc(p[i]);

if i+p[i]>mx then

begin mx:=i+p[i]; id:=i; end;

end;

ans:=0;

for i:=1

to l do

if p[i]-1>ans then ans:=p[i]-1;

end;

begin

while

not eof do

begin

readln(s); readln;

work(); writeln(ans);

end;

end.

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之間由空行...