IOI 2012 - Scrivener
Xem PDFCó người nói Leonardo rất ngưỡng mộ Johannes Gutenberg, người thợ rèn Đức đã phát minh ra kỹ thuật in bằng chữ rời, và bày tỏ lòng kính trọng bằng cách thiết kế máy soạn thảo tôm đồng — il gambero scrivano. Thiết bị đánh máy đơn giản này phần nào giống một máy đánh chữ hiện đại và chỉ nhận hai loại lệnh: gõ ký tự tiếp theo và hoàn tác các lệnh gần nhất. Điểm đáng chú ý là khả năng hoàn tác rất mạnh: bản thân thao tác hoàn tác cũng là một lệnh và cũng có thể bị hoàn tác.
Yêu cầu và giao diện
Hãy cài đặt phiên bản phần mềm của máy soạn thảo. Ban đầu văn bản rỗng. Máy nhận một dãy lệnh từ người dùng và các truy vấn về vị trí cụ thể trong văn bản hiện tại:
Init(): được gọi một lần lúc bắt đầu, không có tham số; có thể dùng để khởi tạo cấu trúc dữ liệu. Lời gọi này không bao giờ phải hoàn tác.TypeLetter(L): thêm một chữ cái thường \(L\) thuộca–zvào cuối văn bản.UndoCommands(U): hoàn tác \(U\) lệnh gần nhất, với \(U\) là số nguyên dương.GetLetter(P): trả về ký tự tại vị trí \(P\) trong văn bản hiện tại, với \(P\) là số nguyên không âm. Ký tự đầu tiên có chỉ số \(0\). Đây là truy vấn, không phải lệnh, nên bị bỏ qua khi đếm các lệnh cần hoàn tác.
Sau lời gọi Init() ban đầu, mỗi chương trình con khác có thể được gọi không lần nào hoặc nhiều lần, theo thứ tự tùy ý. Bảo đảm \(U\) không vượt quá số lệnh đã nhận trước đó, và \(P\) nhỏ hơn độ dài văn bản hiện tại, tức số ký tự trong văn bản.
UndoCommands(U) hoàn tác \(U\) lệnh trước đó theo thứ tự ngược lại. Nếu lệnh bị hoàn tác là TypeLetter(L), ký tự \(L\) được bỏ khỏi cuối văn bản hiện tại. Nếu lệnh bị hoàn tác là UndoCommands(X), thì \(X\) lệnh trước đó được thực hiện lại theo đúng thứ tự ban đầu.
Chi tiết cài đặt
Nộp đúng một tệp scrivener.c, scrivener.cpp hoặc scrivener.pas, cài đặt các chương trình con với chữ ký sau.
C/C++
void Init();
void TypeLetter(char L);
void UndoCommands(int U);
char GetLetter(int P);
Pascal
procedure Init;
procedure TypeLetter(L : Char);
procedure UndoCommands(U : LongInt);
function GetLetter(P : LongInt) : Char;
Các chương trình con phải hoạt động như đã mô tả. Bạn có thể cài đặt thêm các chương trình con dùng nội bộ. Bài nộp không được giao tiếp dưới bất kỳ hình thức nào với đầu vào/đầu ra chuẩn hoặc với bất kỳ tệp nào khác.
Dữ liệu vào
Trình chấm mẫu đọc dòng đầu là tổng số lệnh và truy vấn trong dữ liệu. Mỗi dòng tiếp theo có một trong các dạng:
T, một dấu cách, rồi một chữ cái thường: lệnhTypeLetter.U, một dấu cách, rồi một số nguyên: lệnhUndoCommands.P, một dấu cách, rồi một số nguyên: truy vấnGetLetter.
Dữ liệu ra
Trình chấm mẫu in các ký tự do GetLetter trả về, mỗi ký tự trên một dòng riêng.
Ràng buộc
\(U>0\) và không vượt quá số lệnh đã nhận; \(0 \le P\) và \(P\) nhỏ hơn độ dài văn bản hiện tại. Tổng số lệnh và truy vấn được giới hạn theo phân nhóm dưới đây.
Phân nhóm
| Phân nhóm | Điểm | Điều kiện |
|---|---|---|
| 1 | 5 | Tổng số lệnh và truy vấn từ \(1\) đến \(100\), kể cả hai đầu. Không có lời gọi UndoCommands. |
| 2 | 7 | Tổng số lệnh và truy vấn từ \(1\) đến \(100\), kể cả hai đầu. Không có lệnh UndoCommands nào bị hoàn tác. |
| 3 | 22 | Tổng số lệnh và truy vấn từ \(1\) đến \(5\,000\), kể cả hai đầu. |
| 4 | 26 | Tổng số lệnh và truy vấn từ \(1\) đến \(1\,000\,000\), kể cả hai đầu. Tất cả các lời gọi GetLetter xuất hiện sau tất cả các lời gọi TypeLetter và UndoCommands. |
| 5 | 40 | Tổng số lệnh và truy vấn từ \(1\) đến \(1\,000\,000\), kể cả hai đầu. |
Ví dụ
Ví dụ 1
Input
14
T a
T b
P 1
T d
U 2
U 1
P 2
T e
U 1
U 5
T c
P 2
U 2
P 2
Output
b
d
c
d
Note
Dãy lời gọi và trạng thái văn bản sau mỗi lời gọi như sau. Ô trống ở cột văn bản sau Init() biểu thị văn bản rỗng.
| Lời gọi | Giá trị trả về | Văn bản hiện tại |
|---|---|---|
Init() |
||
TypeLetter(a) |
a |
|
TypeLetter(b) |
ab |
|
GetLetter(1) |
b |
ab |
TypeLetter(d) |
abd |
|
UndoCommands(2) |
a |
|
UndoCommands(1) |
abd |
|
GetLetter(2) |
d |
abd |
TypeLetter(e) |
abde |
|
UndoCommands(1) |
abd |
|
UndoCommands(5) |
ab |
|
TypeLetter(c) |
abc |
|
GetLetter(2) |
c |
abc |
UndoCommands(2) |
abd |
|
GetLetter(2) |
d |
abd |
Kỳ thi:
- IOI 2012 - Ngày 1 (25 Tháng 9., 2012)
Bình luận