簡單來說這是個很水的東西。有點dp的思想吧。推薦兩個部落格,很詳細。
然後以為隨便學點然後去複習,結果……呵呵。什麼鬼資料,兩行之間用空行隔開……沒看到一直wa半節課……
hdu3068最長回文
varview codes1,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.
簡單來說就是判斷是否被前面的覆蓋到,如果有,根據對稱性可以可得乙個長度(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之間由空行...