Advertisement
Guest User

Author

a guest
Dec 26th, 2011
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 2.10 KB | None | 0 0
  1.   var
  2.     fr,fw:text;
  3.     n,m:integer;
  4.     s,w:string;
  5.     ma:array[1..101,1..101] of integer;
  6.  
  7.   var
  8.     wp:array[1..101] of integer;
  9.   procedure prepare;
  10.   var i,j,wl:integer;
  11.       si:char;
  12.   begin
  13.     FillChar(wp,sizeof(wp),0);
  14.     wl:=length(w);
  15.     if wl>1 then
  16.     begin
  17.       for i:=1 to n do
  18.         begin
  19.           si:=s[i];
  20.           if (wp[wl]>0)and(w[wl]=si) then
  21.             begin
  22.             if (ma[wp[wl],i+1]=-1)or(ma[wp[wl],i+1]>wl-wp[wl]-i-1) then
  23.               ma[wp[wl],i+1]:=i+1-wp[wl]-wl;
  24.             end;
  25.           for j:=wl-1 downto 2 do
  26.             if (wp[j]>0)and(w[j]=si) then
  27.               begin
  28.                 wp[j+1]:=wp[j];
  29.                 wp[j]:=0;
  30.               end;
  31.           if w[1]=si then wp[2]:=i;
  32.         end;
  33.     end else
  34.     begin
  35.       for i:=1 to n do
  36.         if s[i]=w[1] then
  37.           begin
  38.             ma[i,i+1]:=0;
  39.           end;
  40.     end;
  41.   end;
  42.  
  43.   var d,u:array[1..101] of integer;
  44.   procedure find_way(start:integer);
  45.   var i,j:integer;
  46.       dmin,darg:integer;
  47.   begin
  48.     for i:=start+1 to n+1 do d[i]:=102;
  49.     d[start]:=0;
  50.     fillChar(u,sizeof(u),0);
  51.     while true do
  52.       begin
  53.         dmin:=102;
  54.         darg:=n+1;
  55.         for j:=start to n+1 do
  56.           if (u[j]=0)and(dmin>d[j]) then
  57.             begin
  58.               dmin:=d[j];
  59.               darg:=j;
  60.             end;
  61.         if darg=n+1 then break;
  62.         u[darg]:=1;
  63.         for j:=start+1 to n+1 do
  64.           if (u[j]=0)and
  65.           (ma[darg,j]>-1)and
  66.           (d[darg]+ma[darg,j]<d[j]) then
  67.             d[j]:=d[darg]+ma[darg,j];
  68.       end;
  69.   end;
  70.  
  71.   procedure Make;
  72.   var i:integer;
  73.       res:integer;
  74.   begin
  75.     find_way(1);
  76.     res:=d[n+1];
  77.     writeln(fw,res);
  78.   end;
  79.  
  80.   var
  81.     i:integer;
  82. begin
  83.   assign(fr,'cipher.dat');
  84.   reset(fr);
  85.   assign(fw,'cipher.sol');
  86.   rewrite(fw);
  87.   readln(fr,n,m);
  88.   readln(fr,s);
  89.  
  90.   FillChar(ma, sizeof(ma), 255);
  91.   for i:=1 to n do
  92.     begin
  93.       ma[i,i+1]:=1;
  94.     end;
  95.   for i:=1 to m do
  96.     begin
  97.       readln(fr,w);
  98.       prepare;
  99.     end;
  100.  
  101.   Make;
  102.  
  103.   close(fr);
  104.   close(fw);
  105. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement