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.