Pagini recente » Borderou de evaluare (job #1280649) | Borderou de evaluare (job #129787) | Borderou de evaluare (job #192847) | Borderou de evaluare (job #3248184) | Cod sursa (job #927810)
Cod sursa(job #927810)
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.