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] Vị trí dòng sống sót qua điều kiện lồng nhau

    Khác với bài toán biên dịch có điều kiện đơn giản (không lồng nhau), thực tế các khối #ifdef/#ifndef/#else/#endif có thể lồng nhau tuỳ ý. Bài này yêu cầu không phải đếm số dòng, mà liệt kê chính xác vị trí (số thứ tự dòng) của các dòng code được giữ lại.

    Cho tập kkk symbol đã định nghĩa, và nnn dòng "mã giả" có thể chứa các khối điều kiện lồng nhau (đảm bảo cú pháp hợp lệ và cân đối). Ngữ nghĩa của #ifdef, #ifndef, #else, #endif giống hệt bài đếm dòng, áp dụng đệ quy: một dòng code chỉ được giữ nếu tất cả các khối tổ tiên (từ ngoài vào trong) chứa nó đều đang ở nhánh "đúng".

    Hãy in ra danh sách (theo thứ tự tăng dần) số thứ tự các dòng code (1-indexed, tính cả các dòng chỉ thị #... trong việc đánh số dòng) được giữ lại.

    Ví dụ: với symbol A; 8 dòng: #ifdef A, #ifdef A, #ifdef A, deep();, #endif, #endif, #endif, after(); — cả hai dòng code (dòng 4 và dòng 8) đều được giữ vì mọi điều kiện tổ tiên đều đúng.

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

      Dòng đầu tiên chứa số nguyên kkk (0≤k≤2000 \le k \le 2000≤k≤200). Dòng thứ hai chứa kkk tên symbol cách nhau khoảng trắng (rỗng nếu k=0k=0k=0). Dòng thứ ba chứa số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000). nnn dòng tiếp theo là nội dung từng dòng mã giả (đọc nguyên văn), đảm bảo các khối #ifdef/#ifndef/#else/#endif lồng nhau hợp lệ.

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

      In ra một dòng chứa các số thứ tự dòng code được giữ lại, tăng dần, cách nhau một khoảng trắng. Nếu không dòng nào được giữ, in ra dòng rỗng.

    Ví dụ:

    Đầu vào:

    0
    
    1
    foo();
    

    Đầu ra:

    1
    

    Đầu vào:

    2
    DEBUG LINUX
    13
    start();
    #ifdef DEBUG
    log1();
    #ifdef LINUX
    log2_linux();
    #else
    log2_other();
    #endif
    log3();
    #else
    skip();
    #endif
    end();
    

    Đầu ra:

    1 3 5 9 13
    

    Đang tải editor...