Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Kiểm tra tương đương hai biểu thức chính quy

    Hai biểu thức chính quy được gọi là tương đương nếu chúng biểu diễn cùng một ngôn ngữ (cùng tập hợp xâu được khớp). Đây là bài toán nền tảng để kiểm chứng các phép biến đổi/tối ưu trên động cơ regex — ví dụ kiểm tra xem hai cách viết lại của cùng một mẫu có thực sự sinh ra cùng tập xâu hay không.

    Cho hai biểu thức chính quy p1,p2p_1, p_2p1​,p2​ (theo đúng văn phạm ở bài "Động cơ regex bằng dựng NFA Thompson"). Gọi Σ\SigmaΣ là hợp các chữ cái thường xuất hiện trong p1p_1p1​ hoặc p2p_2p2​. Hãy xác định L(p1)=L(p2)L(p_1) = L(p_2)L(p1​)=L(p2​) hay không, tức là p1p_1p1​ và p2p_2p2​ có khớp đúng cùng một tập xâu trên Σ∗\Sigma^*Σ∗ hay không.

    Gợi ý cách giải chuẩn: dựng hai DFA D1,D2D_1, D_2D1​,D2​ tương ứng cho p1,p2p_1, p_2p1​,p2​ trên cùng bảng chữ cái Σ\SigmaΣ (qua NFA Thompson rồi dựng tập con), sau đó duyệt (BFS/DFS) automat tích (product automaton) trên các cặp trạng thái (u1,u2)(u_1, u_2)(u1​,u2​), xuất phát từ (start1,start2)(start_1, start_2)(start1​,start2​): nếu tồn tại một cặp trạng thái đến được mà đúng một trong hai trạng thái u1,u2u_1, u_2u1​,u2​ là trạng thái kết thúc của automat tương ứng (tức cặp này thuộc hiệu đối xứng L(p1)△L(p2)L(p_1) \triangle L(p_2)L(p1​)△L(p2​)), thì p1p_1p1​ và p2p_2p2​ không tương đương; nếu duyệt hết mọi cặp đến được mà không gặp trường hợp như vậy thì hai biểu thức tương đương.

    • Định dạng đầu vào:

      Dòng 1 chứa p1p_1p1​ (0≤∣p1∣≤600 \le |p_1| \le 600≤∣p1​∣≤60; có thể là dòng rỗng). Dòng 2 chứa p2p_2p2​ (0≤∣p2∣≤600 \le |p_2| \le 600≤∣p2​∣≤60; có thể là dòng rỗng).

    • Định dạng đầu ra:

      In YES nếu p1p_1p1​ và p2p_2p2​ tương đương, ngược lại in NO.

    Ví dụ:

    Đầu vào:

    a|b
    b|a
    

    Đầu ra:

    YES
    

    Đầu vào:

    (a|b)*
    (a*b*)*
    

    Đầu ra:

    YES
    

    Đang tải editor...