A. Two Substrings – Codeforces 306 (Div. 2)

Dịch đề  A. Two Substrings – Codeforces 306 (Div. 2)

Cho một xâu s. Nhiệm vụ của bạn là xác định xâu s có chứa 2 xâu con “AB”, “BA” không chồng chéo lên nhau (AB, BA nằm ở vị trí bất kì).

input
Dòng duy nhất của input có chứa một chuỗi s có chiều dài từ 1 đến 10^5 gồm các chữ Latin viết hoa.

Output
ghi “YES” (không có dấu ngoặc kép), nếu chuỗi s chứa hai chuỗi con không chồng “AB” và “BA”, và “NO” nếu không.

Chú Ý
Trong test mẫu đầu tiên, mặc dù thực tế rằng có những chuỗi con “AB” và “BA”, nhưng sự xuất hiện của nó chồng chéo lên nhau, vì vậy câu trả lời là “NO”.

Trong Test mẫu thứ hai BACFAB có đầy đủ AB và BA không họ không trùng nhau, nên kết quả là YES

Trong test thứ ba không có xâu “AB” cũng không có xâu”BA”.

Hướng dẫn giải A. Two Substrings – Codeforces 306 (Div. 2)

– Sẽ có 2 loại kết quả dẫn đến đáp án “YES” đó là AB đứng trước BA và BA đứng trước AB

– Đầu tiên xử lí trường hợp AB đứng trước BA: duyệt tìm xâu con “AB” đầu tiên của S, duyệt tìm xâu con “BA” ở cuối dãy xuất hiện đầu tiên của s. Nếu vị trí AB tìm được nằm trước vị trí BA thì kết quả là YES,

– Tương tự trường hợp BA đứng trước AB

– Lưu ý trường hợp với dạng test là “ABA”

– các kết quả còn lại đều là “NO”

Code tham khảo A. Two Substrings – Codeforces 306 (Div. 2)

[sociallocker]

const   fi='';
        nmax=100000;
type    data=longint;
var
        f:text;
        A:array[0..nmax+1] of char;
        n:data;

procedure xuli;
var     i,j:data;
begin
        assign(f,fi); reset(f);
        N:=0;
        while not eoln(f) do
                begin
                        inc(n);
                        read(f,a[n]);
                end;
        close(f);

        for i:=1 to n-1 do  // AB
                if a[i]+a[i+1]='AB' then
                        break;
        for j:=n-1 downto 1 do // BA
                if a[j]+a[j+1]='BA' then
                        break;
        if i+1<j then
                begin
                        writeln('YES');
                        halt;
                end;

        for i:=1 to n do  // BA
                if a[i]+a[i+1]='BA' then
                        break;
        for j:=n-1 downto 1 do // AB
                if a[j]+a[j+1]='AB' then
                        break;
        if i+1<j then
                begin
                        writeln('YES');
                        halt;
                end;
        writeln('NO');

end;

begin
        xuli;
end.

[/sociallocker]

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 *