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] Đếm trạng thái NFA theo Thompson construction

    Thuật toán Thompson construction xây dựng NFA từ biểu thức chính quy bằng cách ghép các "mảnh" NFA (fragment) đệ quy theo cấu trúc cú pháp của biểu thức. Hãy tính tổng số trạng thái của NFA thu được — chỉ dựa trên quy tắc đếm, không cần dựng tường minh đồ thị NFA.

    Bảng chữ cái gồm các ký hiệu là chữ cái thường (a-z) hoặc chữ số (0-9). Biểu thức chính quy RRR được xây dựng từ các ký hiệu đó bằng: phép nối liền kề (concatenation, viết các biểu thức con liền nhau), phép hợp | (độ ưu tiên thấp nhất, kết hợp trái), và các toán tử hậu tố *, +, ? (độ ưu tiên cao nhất, áp dụng cho biểu thức con ngay trước nó, có thể áp dụng liên tiếp nhiều lần); dấu ngoặc đơn ( ) dùng để nhóm. RRR luôn hợp lệ về cú pháp (ngoặc cân xứng, không có toán hạng rỗng, không có khoảng trắng).

    Quy tắc đếm số trạng thái theo Thompson construction chuẩn (như trình bày trong các giáo trình trình biên dịch):

    • Một ký hiệu đơn tạo ra một mảnh NFA gồm đúng 222 trạng thái (trạng thái bắt đầu và trạng thái kết thúc của mảnh, nối với nhau bằng một cạnh đọc ký hiệu đó): size=2\text{size} = 2size=2.
    • Phép nối R1R2R_1 R_2R1​R2​: hợp nhất trạng thái kết thúc của mảnh R1R_1R1​ với trạng thái bắt đầu của mảnh R2R_2R2​ thành một trạng thái duy nhất (không tạo trạng thái mới nào khác): size(R1R2)=size(R1)+size(R2)−1\text{size}(R_1 R_2) = \text{size}(R_1) + \text{size}(R_2) - 1size(R1​R2​)=size(R1​)+size(R2​)−1.
    • Phép hợp R1∣R2R_1 \mid R_2R1​∣R2​: tạo thêm đúng 222 trạng thái mới (một trạng thái bắt đầu mới rẽ hai nhánh epsilon tới hai mảnh con, một trạng thái kết thúc mới nhận epsilon từ hai mảnh con): size(R1∣R2)=size(R1)+size(R2)+2\text{size}(R_1 \mid R_2) = \text{size}(R_1) + \text{size}(R_2) + 2size(R1​∣R2​)=size(R1​)+size(R2​)+2.
    • Mỗi toán tử hậu tố R∗R^*R∗, R+R^+R+, R?R^?R? đều tạo thêm đúng 222 trạng thái mới so với mảnh con bên trong: size=size(R)+2\text{size} = \text{size}(R) + 2size=size(R)+2 (dù ba toán tử này có cấu trúc cạnh nối khác nhau, số trạng thái tăng thêm là như nhau).

    Ví dụ (biểu thức kinh điển trong giáo trình): với R=R = R= (a|b)*abb, NFA theo Thompson construction có đúng 111111 trạng thái.

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

      Một dòng duy nhất chứa biểu thức chính quy RRR hợp lệ, độ dài từ 111 đến 200200200 ký tự, không chứa khoảng trắng.

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

      In ra một số nguyên duy nhất là tổng số trạng thái của NFA theo quy tắc đã nêu ở đề bài.

      Với R=R = R= (a|b)*abb, kết quả in ra là:

      11
      

    Ví dụ:

    Đầu vào:

    (a|b)*abb
    

    Đầu ra:

    11
    

    Đầu vào:

    a
    

    Đầu ra:

    2
    

    Đang tải editor...