Cod sursa(job #846183)

Utilizator OpportunityVlad Negura Opportunity Data 1 ianuarie 2013 17:33:49
Problema Potrivirea sirurilor Scor 14
Compilator fpc Status done
Runda Arhiva educationala Marime 1.16 kb
const mdl=1000000;
var fi,fo:text;
    a,b:array[1..1000]of char;
    s:array[0..1000]of longint;
    i,n,m,h1,h2:longint;

procedure readData;
 begin
  while not eoln(fi) do begin inc(n); read(fi,a[n]); end; readln(fi);
  while not eoln(fi) do begin inc(m); read(fi,b[m]); end;
 end;

function check(k:longint):boolean;
var i:longint;
 begin
  check:=true;
  for i:=k to k+n-1 do
   if b[i]<>a[i-k+1] then
    begin check:=false; exit end;
 end;

procedure writeData;
 begin
  writeln(fo,s[0]);
  for i:=1 to s[0] do write(fo,s[i],' ');
 end;

procedure solve;
 begin
  if n>m then begin write(fo,'0'); close(fo); halt; end;
  h1:=ord(a[1]);
  for i:=2 to n do h1:=(h1+ord(a[i])) mod mdl;
  h2:=ord(b[1]);
  for i:=2 to n do h2:=(h2+ord(b[i])) mod mdl;
  for i:=n to m-n+2 do
   begin
    if (h1=h2)and(check(i-n+1)) then begin inc(s[0]); s[s[0]]:=i-n; end;
    if s[0]=1000 then begin writeData; close(fo); halt; end;
    dec(h2,ord(b[i-n+1]));
    inc(h2,ord(b[i+1]));
   end;
 end;

BEGIN
 assign(fi,'strmatch.in'); reset(fi); assign(fo,'strmatch.out'); rewrite(fo);

  readData;
  solve;
  writeData;

 close(fi); close(fo);
END.