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] Bao đóng epsilon trong NFA

    Trong quá trình xây dựng động cơ regex (regex engine), một bước quan trọng của các thuật toán Thompson construction / subset construction là tính bao đóng epsilon (epsilon-closure) của một tập trạng thái trong NFA.

    Cho một NFA có nnn trạng thái đánh số từ 000 đến n−1n-1n−1 và mmm cạnh chuyển. Mỗi cạnh có dạng (u,v,c)(u, v, c)(u,v,c): từ trạng thái uuu có một chuyển sang trạng thái vvv khi đọc ký hiệu ccc; riêng khi ccc là ký tự E (chữ E in hoa) thì đây là chuyển epsilon (không cần đọc ký hiệu nào để thực hiện chuyển này).

    Cho tập trạng thái ban đầu SSS (có thể có 000 phần tử), hãy tính bao đóng epsilon của SSS: tập tất cả các trạng thái có thể đến được từ SSS chỉ bằng các chuyển epsilon (một trạng thái luôn thuộc bao đóng epsilon của tập chứa nó, kể cả khi nó không có cạnh epsilon đi ra).

    Ví dụ: với n=4n=4n=4, m=4m=4m=4 và các cạnh (0,1,E)(0,1,E)(0,1,E), (1,2,E)(1,2,E)(1,2,E), (2,3,a)(2,3,a)(2,3,a), (0,3,b)(0,3,b)(0,3,b), S={0}S = \{0\}S={0}: bao đóng epsilon của SSS là {0,1,2}\{0,1,2\}{0,1,2} (trạng thái 333 không thuộc bao đóng vì cạnh (2,3)(2,3)(2,3) đọc ký hiệu a, không phải epsilon; cạnh (0,3,b)(0,3,b)(0,3,b) cũng vậy).

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

      Dòng 1: hai số nguyên nnn và mmm.

      mmm dòng tiếp theo, mỗi dòng gồm ba giá trị uuu, vvv, ccc cách nhau bởi khoảng trắng (0≤u,v<n0 \le u, v < n0≤u,v<n; ccc là một ký tự — có thể là chữ cái/chữ số làm ký hiệu, hoặc chữ E biểu diễn epsilon).

      Dòng tiếp theo là số nguyên kkk (0≤k≤n0 \le k \le n0≤k≤n) — số trạng thái trong tập ban đầu SSS.

      Nếu k>0k > 0k>0: dòng cuối cùng gồm kkk số nguyên là các trạng thái của SSS, cách nhau bởi khoảng trắng. Nếu k=0k = 0k=0 thì S=∅S = \emptysetS=∅ (dòng cuối có thể không xuất hiện hoặc là dòng rỗng).

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

      In ra một dòng gồm các trạng thái thuộc bao đóng epsilon của SSS, liệt kê theo thứ tự tăng dần, cách nhau bởi đúng một khoảng trắng. Nếu bao đóng rỗng (chỉ xảy ra khi k=0k=0k=0), in ra một dòng rỗng.

      Với ví dụ ở trên, kết quả in ra là:

      0 1 2
      

    Ví dụ:

    Đầu vào:

    4 4
    0 1 E
    1 2 E
    2 3 a
    0 3 b
    1
    0
    

    Đầu ra:

    0 1 2
    

    Đầu vào:

    3 2
    0 1 E
    1 2 a
    0
    

    Đầu ra:

    
    

    Đang tải editor...