Từ đối xứng pascal

1. Đề bài Từ đối xứng

Hai từ được gọi là đối xứng nếu từ này là từ đảo ngược của từ kia.

Cho file BAI1.INP mỗi dòng chứa một xâu ký tự. Hãy in ra số từ phân biệt có từ đối xứng ở trong mỗi dòng.

Kết quả in ra file BAI1.OUT, mỗi dòng ghi số từ phân biệt có từ đối xứng. Nếu không có ghi kết quả là số 0.

Lưu ý: Nếu có nhiều cặp từ đối xứng giống nhau chỉ tính 1.

Ví dụ:

INPUT

a

ab ab cd ba cd ba dc dc

tom la mot loai dong vat

abc abc cba cba

OUTPUT

0

2

1

1

Độ dài mỗi dòng chỉ trong kiểu string

2. Hướng dẫn làm bài từ đối xứng pascal

– Nhận xét một từ được phân biệt bằng dấu khoảng trắng, chính vì vậy ta sẽ tách các từ dựa trên dấu khoảng trắng.

– Bài này ta có nhiều cách làm, các bạn có thể tách các từ xong bỏ vào mảng để duyệt N^2, hoặc tách được từ nào xử lí từ đó ngay trên xâu sau đó xóa từ đó khỏi xâu.

3. Code tham khảo từ đối xứng pascal

Program tudoixung;
var st:string;

procedure chuanhoa(var st:string);
var     vt:longint;
begin
        st:=' '+st+' ';
        vt:=pos('  ',st);
        while vt<>0 do
                begin
                        delete(st,vt,1);
                        vt:=pos('  ',st);
                end;
        delete(st,1,1); delete(st,length(st),1);
end;

Function tudao(st:string):string;
var  s:string;
     i:byte;
begin
     s:='';
     for i:=length(st) downto 1 do s:=s+st[i];
     tudao:=s;
end;

function demsotu(st:string):integer;
var  d,i:integer;
begin
     d:=1;
     for i:=1 to length(st) do
     if st[i]=' ' then d:=d+1;
     demsotu:=d;
end;

function demtu(st:string):integer;
var  tu,tu1:string; i,dem:byte;
        vt:longint;
begin
     dem:=0;
     tu:='';
     tu1:='';
     chuanhoa(st);
     while demsotu(st)>1 do
           begin
                i:=1;
                tu:='';

                while st[i]<>' ' do
                      begin
                           tu:=tu+st[i];
                           inc(i);
                      end;
                tu1:=tudao(tu);
                if pos(tu1,st)<>0 then inc(dem);

                vt:=pos(tu1,st);
                while vt<>0 do
                        begin
                                delete(st,vt,length(tu1));
                                vt:=pos(tu1,st);
                        end;
                vt:=pos(tu,st);
                while vt<>0 do
                        begin
                                delete(st,vt,length(tu1));
                                vt:=pos(tu,st);
                        end;
                chuanhoa(st);
           end;
           demtu:=dem;
end;

Procedure out;
var f,g:text;
begin
    assign(f,'tudoixung.inp');
    assign(g,'tudoixung.out');
    reset(f);
    rewrite(g);
    while not seekeof(f) do
      begin
          readln(f,st);
          writeln(g,demtu(st));
      end;
    close(f);
    close(g);
end;
BEGIN
     OUT;
END.

2 thoughts on “Từ đối xứng pascal

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *