VWORDPOW - Sức mạnh của ngôn từ

Tác giả: RR

Ngôn ngữ: Pascal

//Written by RR

{$MODE OBJFPC}

uses math;
const
  FINP          =       '';
  FOUT          =       '';
  MAXN          =       1011;

var
  f1,f2         :       text;
  m,n           :       longint;
  a             :       array[1..MAXN] of ansistring;
  b             :       array[1..MAXN] of string[31];
  stack         :       array['A'..'Z',1..MAXN] of longint;
  top,now       :       array['A'..'Z'] of longint;

procedure openF;
    begin
      assign(f1,FINP); reset(f1);
      assign(f2,FOUT); rewrite(f2);
    end;

procedure closeF;
    begin
      close(f1);
      close(f2);
    end;

procedure inp;
    var
      i,j:longint;
    begin
      readln(f1,m,n);
      for i:=1 to m do
        begin
          readln(f1,a[i]);
          for j:=length(a[i]) downto 1 do
            a[i,j]:=upcase(a[i,j]);
        end;
      for i:=1 to n do
        begin
          readln(f1,b[i]);
          for j:=length(b[i]) downto 1 do
            b[i,j]:=upcase(b[i,j]);
        end;
    end;

procedure solve;
    var
      i,j,res,k,u:longint;
      c:char;
      ok:boolean;
    begin
      for i:=1 to m do
        begin
          res:=0;
          fillchar(top,sizeof(top),0);
          for j:=1 to length(a[i]) do
            begin
              c:=a[i,j];
              inc(top[c]);
              stack[c,top[c]]:=j;
            end;

          u:=0;
          for k:=1 to n do
            begin
              for c:='A' to 'Z' do now[c]:=1;
              ok:=true;
              u:=0;
              for j:=1 to length(b[k]) do
                begin
                  c:=b[k,j];
                  while (now[c]<=top[c]) and (stack[c,now[c]]<=u) do inc(now[c]);
                  if (now[c]>top[c]) then
                    begin
                      ok:=false;
                      break;
                    end;
                  u:=stack[c,now[c]];
                end;
              if ok then inc(res);
            end;
          writeln(f2,res);
        end;
    end;

begin
  openF;
  inp;
  solve;
  closeF;
end.

Download