Cod sursa(job #927810)

Utilizator Dddarius95Darius-Florentin Neatu Dddarius95 Data 26 martie 2013 01:25:21
Problema Potrivirea sirurilor Scor 0
Compilator fpc Status done
Runda Arhiva educationala Marime 1.48 kb
program potrivire2;
var i,m,n,k,nrsol:longint;
    a,b:array[1..2000001] of char;
    r:set of char;
    sol:array[0..1010] of longint;
    p:array[0..2000000] of longint;
    f,g:text;
    intrare,iesire:array[0..1 shl 20] of char;
begin
assign(f,'kmp.in'); reset(f);
assign(g,'kmp.out'); rewrite(g);
settextbuf(f,intrare); settextbuf(g,iesire);
r:=['A'..'Z']+['a'..'z']+['0'..'9'];
readln(f,a); read(f); readln(f,b);
p[1]:=0; k:=0; m:=1; n:=1;
while a[m] in r do m:=m+1;
while b[n] in r do n:=n+1;
m:=m-1; n:=n-1;
for i:=2 to m do begin
                 while (k>0) and (a[k+1]<>a[i]) do k:=p[k];
                 if a[k+1]=a[i] then k:=k+1;
                 p[i]:=k;
                 end;
k:=0; nrsol:=0;
for i:=1 to n do begin
                 while (k>0) and (a[k+1]<>b[i]) do k:=p[k];
                 if a[k+1]=b[i] then k:=k+1;
                  if k=m then begin
                              k:=p[m];
                              nrsol:=nrsol+1;
                              if nrsol<=1000 then sol[nrsol]:=i-m;
                              end;
                 end;
writeln(g,nrsol);
if nrsol>1000 then nrsol:=1000;
for i:=1 to nrsol do write(g,sol[i],' ');
writeln(g);

m:=1;n:=1;
while a[m] in r do begin
                   write(g,a[m]);
                   inc(m);
                   end;
writeln(g);
while b[n] in r do begin
                   write(g,b[n]);
                   inc(n);
                   end;
writeln(g);

close(f); close(g);
end.