Đề bài:
Thuật toán:
Chặt nhị phần + Hash
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.


Recent Comments