# PALINY – spoj

Gợi ý 1
Gợi ý 2

## Code:

{\$H+} uses math; const fi='';//paliny.inp'; fo='';//paliny.out'; maxn=50003; pp=307; base=trunc$1e9$+7; var i,j,n,d,c,g,top,ans : longint; ha,hb,pow : array[0..maxn] of int64; a : array[1..maxn] of longint; s : string; function gethash1$l,r : longint$ : int64; begin gethash1 := $ha[r] - ha[l-1] * pow[r-l+1] + base * base$ mod base; end; function gethash2$l,r : longint$ : int64; begin gethash2 := $hb[r] - hb[l+1] * pow[l-r+1] + base * base$ mod base; end; function ok $le : longint$ : boolean; var i,j : longint; begin for i := 1 to n - le + 1 do if gethash1$i,i+le-1$ = gethash2$i+le-1,i$ then exit$true$; exit$false$; end; procedure process; begin d := 1 ; c := top ; g := $d+c$ div 2; while $G<>d$ and $g<>C$ do begin if ok $a[g]$ then d := g else c := g; g := $d+c$ div 2; end; for g := c downto d do if ok $a[g]$ then begin ans := max$ans,a[g]$; exit; end; end; procedure push$x : longint$; begin inc$top$; a[top] := x; end; begin assign$input,fi$;reset$input$; assign$output,fo$;rewrite$output$; readln$n$; readln$s$; pow[0] := 1; for i := 1 to n do pow[i] := pow[i-1] * pp mod base; for i := 1 to n do ha[i] := $ha[i-1] * pp + ord(s[i]$ ) mod base; for i := n downto 1 do hb[i] := $hb[i+1] * pp + ord(s[i]$ ) mod base; top := 0; for i := 1 to n do if i mod 2 = 0 then push$i$; process; top := 0; for i := 1 to n do if i mod 2 = 1 then push$i$; process; writeln$ans$; close$input$;close$output$; end.
Khuyên dùng