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] Động cơ regex bằng dựng NFA Thompson

    Xây dựng một động cơ regex theo phương pháp kinh điển: dựng NFA theo thuật toán Thompson từ biểu thức chính quy, rồi mô phỏng NFA đó (bằng ε\varepsilonε-closure) để kiểm tra khớp mẫu.

    Xét văn phạm biểu thức chính quy trên bảng chữ cái gồm các chữ cái tiếng Anh thường, với các phép toán theo thứ tự ưu tiên tăng dần: hợp | (union) có độ ưu tiên thấp nhất, tiếp theo là nối tiếp (concatenation, được viết ngầm định giữa hai thành phần liền nhau, không có ký hiệu riêng), và lặp Kleene * (star) có độ ưu tiên cao nhất; dấu ngoặc đơn ( ) dùng để nhóm và ghi đè thứ tự ưu tiên mặc định. Một nhánh của phép hợp | được phép rỗng, biểu diễn xâu rỗng ε\varepsilonε — ví dụ mẫu a| khớp a hoặc khớp xâu rỗng.

    Cho biểu thức chính quy ppp (đảm bảo hợp lệ theo văn phạm trên) và một xâu sss gồm chữ cái thường, hãy xác định ppp có khớp toàn bộ (full match, từ đầu tới cuối) xâu sss hay không.

    Ví dụ: p=p = p= (a|b)*abb, s=s = s= ababababb → khớp, vì sss có thể viết thành (ab)3⋅abb(ab)^3 \cdot abb(ab)3⋅abb... tổng quát hơn: sss là một dãy tuỳ ý các ký tự a,ba,ba,b và kết thúc bằng abb.

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

      Dòng 1 chứa biểu thức chính quy ppp (0≤∣p∣≤3000 \le |p| \le 3000≤∣p∣≤300; có thể là dòng rỗng, tương ứng biểu thức chỉ khớp xâu rỗng). Dòng 2 chứa xâu sss (0≤∣s∣≤3000 \le |s| \le 3000≤∣s∣≤300, chỉ gồm chữ cái thường; có thể là dòng rỗng).

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

      In YES nếu ppp khớp toàn bộ sss, ngược lại in NO.

    Ví dụ:

    Đầu vào:

    a*b
    b
    

    Đầu ra:

    YES
    

    Đầu vào:

    a*b
    aaab
    

    Đầu ra:

    YES
    

    Đang tải editor...