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 số xâu độ dài L khớp biểu thức chính quy

    Cho biểu thức chính quy ppp (theo đúng văn phạm ở bài "Động cơ regex bằng dựng NFA Thompson": chữ cái thường, |, *, nối tiếp ngầm định, dấu ngoặc ()). Gọi Σ\SigmaΣ là tập các chữ cái thường xuất hiện trong ppp — đây chính là bảng chữ cái hữu hạn của bài toán.

    Cho một số nguyên LLL, hãy đếm số xâu độ dài đúng LLL trên bảng chữ cái Σ\SigmaΣ được ppp khớp toàn bộ, lấy kết quả modulo 109+710^9+7109+7.

    Gợi ý cách giải chuẩn: dựng NFA Thompson từ ppp, xác định hoá bằng dựng tập con để được DFA hữu hạn trạng thái, lập ma trận vuông MMM với MijM_{ij}Mij​ là số ký hiệu của Σ\SigmaΣ khiến DFA chuyển trực tiếp từ trạng thái iii sang trạng thái jjj, rồi dùng luỹ thừa ma trận nhanh (O(soˆˊ trạng thaˊi3log⁡L)O(\text{số trạng thái}^3 \log L)O(soˆˊ trạng thaˊi3logL)) để tính MLM^LML; đáp số là tổng các phần tử ở hàng ứng với trạng thái đầu, cột ứng với các trạng thái kết thúc của DFA.

    Quy ước: nếu ppp không chứa chữ cái nào (chỉ có thể khớp xâu rỗng ε\varepsilonε), coi Σ=∅\Sigma = \emptysetΣ=∅; khi đó nếu L=0L=0L=0, đáp số là 111 nếu ppp khớp xâu rỗng và 000 nếu không; nếu L>0L>0L>0, đáp số luôn là 000.

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

      Dòng 1 chứa biểu thức chính quy ppp (0≤∣p∣≤600 \le |p| \le 600≤∣p∣≤60; có thể là dòng rỗng). Dòng 2 chứa số nguyên LLL (0≤L≤10150 \le L \le 10^{15}0≤L≤1015).

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

      In ra một số nguyên duy nhất — số xâu độ dài LLL được ppp khớp, modulo 109+710^9+7109+7.

    Ví dụ:

    Đầu vào:

    (a|b)*
    10
    

    Đầu ra:

    1024
    

    Đầu vào:

    a*b*
    6
    

    Đầu ra:

    7
    

    Đang tải editor...