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] Biên dịch Có Điều Kiện Lồng Nhau Nhiều Cấp

    Mở rộng bài toán biên dịch có điều kiện: các chỉ thị #ifdef TÊN, #ifndef TÊN, #else, #endif giờ đây có thể lồng nhau ở nhiều cấp tuỳ ý (một khối #ifdef có thể chứa bên trong nó các khối #ifdef/#ifndef khác, sâu bao nhiêu cấp cũng được).

    Một dòng mã nguồn (không phải chỉ thị) được giữ lại khi và chỉ khi mọi khối điều kiện đang bao quanh nó (từ ngoài vào trong) đều đang ở nhánh được chọn (nhánh mà điều kiện #ifdef/#ifndef đúng, hoặc nhánh #else khi điều kiện ban đầu sai). Chỉ cần MỘT cấp bao quanh đang ở nhánh không được chọn, dòng đó bị loại bỏ, bất kể các chỉ thị lồng bên trong nó là gì (những chỉ thị lồng bên trong dòng bị loại vẫn phải được đọc và khớp cặp đúng theo cấu trúc, nhưng không ảnh hưởng gì đến việc dòng đó có được giữ hay không).

    Dữ liệu đảm bảo mọi #ifdef/#ifndef đều có #endif khớp cặp hợp lệ (đúng cấu trúc ngoặc lồng nhau), mỗi khối có tối đa một #else.

    Ví dụ: Với macro đã định nghĩa {A} và chương trình:

    #ifdef A
    line1
    #ifdef B
    line2
    #else
    line3
    #endif
    line4
    #endif
    

    Kết quả in ra là line1, line3, line4 (vì B không được định nghĩa nên nhánh #else bên trong được chọn, còn khối A bên ngoài luôn được chọn nên line4 cũng được giữ).

    • Định dạng đầu vào:
      • Dòng 1: số nguyên kkk (0≤k≤1000 \le k \le 1000≤k≤100) — số macro đã được định nghĩa.
      • Dòng 2: kkk tên macro cách nhau bởi khoảng trắng (nếu k=0k=0k=0, đây là dòng trống).
      • Dòng 3: số nguyên nnn (0≤n≤20000 \le n \le 20000≤n≤2000) — số dòng chương trình.
      • nnn dòng tiếp theo: mỗi dòng là chỉ thị #ifdef TÊN, #ifndef TÊN, #else, #endif, hoặc một dòng mã nguồn khác không rỗng. Độ sâu lồng nhau tối đa 500.
    • Định dạng đầu ra:

      In ra các dòng mã nguồn còn được giữ lại (đã loại bỏ mọi dòng chỉ thị), theo đúng thứ tự xuất hiện ban đầu, mỗi dòng một dòng.

    Ví dụ:

    Đầu vào:

    1
    A
    9
    #ifdef A
    line1
    #ifdef B
    line2
    #else
    line3
    #endif
    line4
    #endif

    Đầu ra:

    line1
    line3
    line4
    

    Đầu vào:

    0
    
    5
    #ifdef X
    #ifdef Y
    inner
    #endif
    #endif

    Đầu ra:

    
    

    Đang tải editor...