Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var
- fr,fw:text;
- n,m:integer;
- s,w:string;
- ma:array[1..101,1..101] of integer;
- var
- wp:array[1..101] of integer;
- procedure prepare;
- var i,j,wl:integer;
- si:char;
- begin
- FillChar(wp,sizeof(wp),0);
- wl:=length(w);
- if wl>1 then
- begin
- for i:=1 to n do
- begin
- si:=s[i];
- if (wp[wl]>0)and(w[wl]=si) then
- begin
- if (ma[wp[wl],i+1]=-1)or(ma[wp[wl],i+1]>wl-wp[wl]-i-1) then
- ma[wp[wl],i+1]:=i+1-wp[wl]-wl;
- end;
- for j:=wl-1 downto 2 do
- if (wp[j]>0)and(w[j]=si) then
- begin
- wp[j+1]:=wp[j];
- wp[j]:=0;
- end;
- if w[1]=si then wp[2]:=i;
- end;
- end else
- begin
- for i:=1 to n do
- if s[i]=w[1] then
- begin
- ma[i,i+1]:=0;
- end;
- end;
- end;
- var d,u:array[1..101] of integer;
- procedure find_way(start:integer);
- var i,j:integer;
- dmin,darg:integer;
- begin
- for i:=start+1 to n+1 do d[i]:=102;
- d[start]:=0;
- fillChar(u,sizeof(u),0);
- while true do
- begin
- dmin:=102;
- darg:=n+1;
- for j:=start to n+1 do
- if (u[j]=0)and(dmin>d[j]) then
- begin
- dmin:=d[j];
- darg:=j;
- end;
- if darg=n+1 then break;
- u[darg]:=1;
- for j:=start+1 to n+1 do
- if (u[j]=0)and
- (ma[darg,j]>-1)and
- (d[darg]+ma[darg,j]<d[j]) then
- d[j]:=d[darg]+ma[darg,j];
- end;
- end;
- procedure Make;
- var i:integer;
- res:integer;
- begin
- find_way(1);
- res:=d[n+1];
- writeln(fw,res);
- end;
- var
- i:integer;
- begin
- assign(fr,'cipher.dat');
- reset(fr);
- assign(fw,'cipher.sol');
- rewrite(fw);
- readln(fr,n,m);
- readln(fr,s);
- FillChar(ma, sizeof(ma), 255);
- for i:=1 to n do
- begin
- ma[i,i+1]:=1;
- end;
- for i:=1 to m do
- begin
- readln(fr,w);
- prepare;
- end;
- Make;
- close(fr);
- close(fw);
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement