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] Rút gọn chuỗi nhảy (Jump Threading) và phát hiện vòng lặp vô hạn

    Rút gọn chuỗi nhảy (jump threading) là một tối ưu hóa điều khiển: nếu một khối chỉ chứa lệnh nhảy không điều kiện GOTO L, ta có thể thay mọi cạnh trỏ tới khối đó bằng cạnh trỏ thẳng tới đích cuối cùng sau khi đi hết chuỗi GOTO.

    Cho nnn khối lệnh đánh số 1..n1..n1..n, mỗi khối được mô tả bởi đúng một dòng: GOTO L (khối chỉ nhảy tới khối LLL) hoặc END (khối kết thúc, không nhảy đi đâu). Với mỗi khối iii, hãy xác định kết quả khi "chạy" bắt đầu từ khối đó và luôn đi theo lệnh GOTO:

    • Nếu bản thân khối iii là END, in END.
    • Nếu đi theo chuỗi GOTO từ khối iii cuối cùng đến được một khối END số jjj, in jjj.
    • Nếu chuỗi GOTO từ khối iii đi mãi mà không bao giờ đến được khối END nào (rơi vào vòng lặp vô hạn), in LOOP.

    Ví dụ: 5 khối: GOTO 2, GOTO 3, END, GOTO 5, GOTO 4. Khối 1 → 2 → 3 (END) nên kết quả là 3. Khối 2 → 3 (END) nên kết quả là 3. Khối 3 là END nên in END. Khối 4 → 5 → 4 → ... lặp vô hạn nên in LOOP. Khối 5 tương tự cũng in LOOP.

    • Định dạng đầu vào:
      • Dòng đầu: số nguyên nnn (1≤n≤20001 \le n \le 20001≤n≤2000).
      • nnn dòng tiếp theo: mô tả khối 1,…,n1, \ldots, n1,…,n theo đúng thứ tự, mỗi dòng là GOTO L (1≤L≤n1 \le L \le n1≤L≤n) hoặc END.
    • Định dạng đầu ra:

      In ra nnn dòng, dòng thứ iii là kết quả của khối iii: END, một số nguyên (chỉ số khối END cuối cùng đến được), hoặc LOOP.

    Ví dụ:

    Đầu vào:

    5
    GOTO 2
    GOTO 3
    END
    GOTO 5
    GOTO 4
    

    Đầu ra:

    3
    3
    END
    LOOP
    LOOP
    

    Đầu vào:

    1
    END
    

    Đầu ra:

    END
    

    Đang tải editor...