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] Phân tích luồng dữ liệu: biểu thức khả dụng (Available Expressions)

    Cho đồ thị điều khiển luồng (CFG) gồm nnn khối cơ bản đánh số 1,…,n1,\ldots,n1,…,n và mmm cạnh có hướng u→vu \to vu→v. Có EEE biểu thức đánh số 1,…,E1,\ldots,E1,…,E. Với mỗi khối BBB, cho trước:

    • GEN[B]GEN[B]GEN[B]: tập biểu thức được tính tại BBB và còn "sống" (chưa bị vô hiệu) đến cuối khối.
    • KILL[B]KILL[B]KILL[B]: tập biểu thức bị vô hiệu tại BBB (một trong các toán hạng của biểu thức bị gán lại trong BBB).

    Tính tập biểu thức khả dụng (available expressions) — bài toán "must" (giao các nhánh) — bằng phương trình lặp điểm bất động chuẩn: IN[B]=⋂P∈pred(B)OUT[P](IN[B]=∅ neˆˊu B khoˆng coˊ tieˆˋn toˆˊ naˋo)IN[B] = \bigcap_{P \in pred(B)} OUT[P] \qquad (IN[B] = \varnothing \text{ nếu } B \text{ không có tiền tố nào})IN[B]=⋂P∈pred(B)​OUT[P](IN[B]=∅ neˆˊu B khoˆng coˊ tieˆˋn toˆˊ naˋo) OUT[B]=GEN[B]∪(IN[B]∖KILL[B])OUT[B] = GEN[B] \cup (IN[B] \setminus KILL[B])OUT[B]=GEN[B]∪(IN[B]∖KILL[B])

    Khởi tạo OUT[B]={1,…,E}OUT[B] = \{1,\ldots,E\}OUT[B]={1,…,E} với mọi BBB, lặp lại cho đến khi mọi OUT[B]OUT[B]OUT[B] không còn thay đổi (thuật toán đơn điệu, luôn hội tụ về nghiệm nhỏ nhất — chính là nghiệm đúng của bài toán).

    In ra nnn dòng, dòng thứ BBB là các chỉ số biểu thức thuộc OUT[B]OUT[B]OUT[B] sau khi hội tụ, theo thứ tự tăng dần, cách nhau dấu phẩy (không khoảng trắng); nếu rỗng in -.

    Ví dụ

    Input:

    3 2 2
    1 2
    2 3
    1 1 0
    1 2 1 1
    0 0
    

    (3 khối, 2 biểu thức, cạnh 1→21\to21→2, 2→32\to32→3; khối 1: GEN={1},KILL=∅GEN=\{1\}, KILL=\varnothingGEN={1},KILL=∅; khối 2: GEN={2},KILL={1}GEN=\{2\}, KILL=\{1\}GEN={2},KILL={1}; khối 3: GEN=∅,KILL=∅GEN=\varnothing, KILL=\varnothingGEN=∅,KILL=∅)

    Output:

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

      Dòng đầu: 3 số nguyên n,E,mn, E, mn,E,m (1≤n≤2001 \le n \le 2001≤n≤200, 1≤E≤601 \le E \le 601≤E≤60, 0≤m≤20000 \le m \le 20000≤m≤2000). mmm dòng tiếp theo, mỗi dòng "uuu vvv" là cạnh u→vu \to vu→v (1≤u,v≤n1 \le u, v \le n1≤u,v≤n). Tiếp theo, với mỗi khối B=1,…,nB = 1,\ldots,nB=1,…,n theo thứ tự: một dòng gồm số nguyên ggg (kích thước GEN[B]GEN[B]GEN[B]), ggg chỉ số biểu thức, số nguyên kkk (kích thước KILL[B]KILL[B]KILL[B]), rồi kkk chỉ số biểu thức.

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

      In nnn dòng, dòng BBB là OUT[B]OUT[B]OUT[B] (chỉ số tăng dần, cách nhau dấu phẩy, không khoảng trắng); in - nếu OUT[B]OUT[B]OUT[B] rỗng.

    Ví dụ:

    Đầu vào:

    3 2 2
    1 2
    2 3
    1 1 0
    1 2 1 1
    0 0
    

    Đầu ra:

    1
    2
    2
    

    Đầu vào:

    1 1 0
    1 1 0
    

    Đầu ra:

    1
    

    Đang tải editor...