Задача по строкам

Jumbo.love
Дата: 28.04.2011 23:08:07
Я решал приложенную задачу как будто это строка (алфавит до 100000 символов получается), т.е. через хэши на delphi. Онм хранились в массиве int64, т.е. намного обрезались и ,видимо, поэтому неправильный ответ на 27 тесте. кто-нибудь подскажет как решить лучше, что бы было меньше коллизий(один хэш для разных строк).
program cubes;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var f,f1:text;
 p:array[0..100000] of int64;
 h1,h2,s:array[0..100000] of int64;
 n,m,i:integer;

function ok(d:integer):boolean;
var i:integer;
begin
 for i:=d downto 1 do if s[i]<>s[2*d-i+1] then begin ok:=false;exit end;
 ok:=true;
end;


function prost(a:integer):boolean;
var i:integer;
begin
 if a=2 then begin prost:=false; exit end;
 for i:=a div 2 downto 2 do if a mod i=0 then begin prost:=false; exit end;
 prost:=true;
end;

begin
 reset(f,'cubes.in');
 rewrite(f1,'cubes.out');
 readln(f,n,m);
 while not prost(m) do m:=m+1;

 p[0]:=1; p[1]:=m;
 for i:=2 to n do p[i]:=p[i-1]*m;{степени P}
 for i:=1 to n do begin
  read(f,s[i]);
  h1[i]:=h1[i-1]+s[i]*p[i-1]
 end;
 for i:=1 to n do h2[i]:=h2[i-1]+s[n-i+1]*p[i-1];
  {хэши префиксов и обратные хэши префиксов}

 for i:=n div 2 downto 0 do
  if h1[i]*p[n-2*i]=h2[n-i]-h2[n-2*i] then write(f1,n-i,' ');

 close(f);
 close(f1);
end.
Jumbo.love
Дата: 28.04.2011 23:12:25
http://radikal.ru/F/i078.radikal.ru/1104/88/679db59ada7f.jpg.html

Модератор: Тема перенесена из форума "Программирование".