am problema urmatoare:
Se consideră alfabetul compus din literele mici, de la a la z, fără diacritice. Se numeşte cuvânt un şir finit, eventual vid, de litere din alfabet. Se numeşte mască un şir de caractere din alfabet având eventual în plus caracterele ? şi * cu următoarea semnificaţie: caracterul ? înlocuieşte oricare din literele de la a la z (o singură literă) iar caracterul * înlocuieşte un cuvânt oarecare, eventual vid, format cu litere de la a la z.
Spre exemplu avem masca a?b*c. Dacă avem 3 cuvinte şi anume abbc, acbaac şi abac atunci primele 2 se potrivesc cu masca.
se gaseste pe pb info si nu stiu cum sa fac codul.
Răspunsuri la întrebare
Răspuns de
1
Am sa-ti dau solutia oficiala a acestei probleme. Succes!
program sablon;
var fisier,g:text;
exp,s:string;
n,i,j,k:integer;
p:integer;
gasit:boolean;
x:array[1..1000]of string;
function f(exp,s:string):boolean;
var i:integer;ok:boolean;
begin
if exp='' then if s='' then f:=true
else f:=false
else
if (exp[1]>='a')and(exp[1]<='z') then
if s<>'' then
if s[1]=exp[1] then
begin
delete(exp,1,1);
delete(s,1,1);
f:=f(exp,s)
end
else {s[1]<>exp[1]} f:=false
else {s=''} f:=false
else
if exp[1]='?' then
if s<>'' then
begin
delete(exp,1,1);
delete(s,1,1);
f:=f(exp,s)
end
else f:=false
else {exp[1]='*'}
begin
delete(exp,1,1);
ok:=f(exp,s);
for i:=1 to length(s) do
begin
delete(s,1,1);
ok:=ok or f(exp,s);
end;
f:=ok;
end;
end;
begin
assign(fisier,'masca.in');
reset(fisier);
readln(fisier,p);
readln(fisier,exp);
readln(fisier,n);
if p=2 then
begin
k:=0;
for i:=1 to n do
begin
readln(fisier,s);
if f(exp,s) then
begin
gasit:=false;
for j:=1 to k do
if s=x[j] then gasit:=true;
if not(gasit) then
begin inc(k);
x[k]:=s;
end;
end;
end;
close(fisier);
end
else
begin
k:=0;
for i:=1 to n do
begin
readln(fisier,s);
begin
gasit:=false;
for j:=1 to k do
if s=x[j] then gasit:=true;
if not(gasit) then
begin inc(k);
x[k]:=s;
end;
end;
end;
close(fisier);
end;
{writeln(exp);
for j:=1 to k do
writeln(x[j],' DA');
writeln('nr=',k);}
assign(g,'masca.out');
rewrite(g);
writeln(g,k);
close(g);
end.
program sablon;
var fisier,g:text;
exp,s:string;
n,i,j,k:integer;
p:integer;
gasit:boolean;
x:array[1..1000]of string;
function f(exp,s:string):boolean;
var i:integer;ok:boolean;
begin
if exp='' then if s='' then f:=true
else f:=false
else
if (exp[1]>='a')and(exp[1]<='z') then
if s<>'' then
if s[1]=exp[1] then
begin
delete(exp,1,1);
delete(s,1,1);
f:=f(exp,s)
end
else {s[1]<>exp[1]} f:=false
else {s=''} f:=false
else
if exp[1]='?' then
if s<>'' then
begin
delete(exp,1,1);
delete(s,1,1);
f:=f(exp,s)
end
else f:=false
else {exp[1]='*'}
begin
delete(exp,1,1);
ok:=f(exp,s);
for i:=1 to length(s) do
begin
delete(s,1,1);
ok:=ok or f(exp,s);
end;
f:=ok;
end;
end;
begin
assign(fisier,'masca.in');
reset(fisier);
readln(fisier,p);
readln(fisier,exp);
readln(fisier,n);
if p=2 then
begin
k:=0;
for i:=1 to n do
begin
readln(fisier,s);
if f(exp,s) then
begin
gasit:=false;
for j:=1 to k do
if s=x[j] then gasit:=true;
if not(gasit) then
begin inc(k);
x[k]:=s;
end;
end;
end;
close(fisier);
end
else
begin
k:=0;
for i:=1 to n do
begin
readln(fisier,s);
begin
gasit:=false;
for j:=1 to k do
if s=x[j] then gasit:=true;
if not(gasit) then
begin inc(k);
x[k]:=s;
end;
end;
end;
close(fisier);
end;
{writeln(exp);
for j:=1 to k do
writeln(x[j],' DA');
writeln('nr=',k);}
assign(g,'masca.out');
rewrite(g);
writeln(g,k);
close(g);
end.
ochiuverde:
imi poti spune te rog daca gasesc si sursa in c++?
Alte întrebări interesante
Limba română,
8 ani în urmă
Istorie,
8 ani în urmă
Biologie,
8 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă
Geografie,
9 ani în urmă