[Buổi 25][Đóng gói][ADV] Bài 1: Tài khoản kiểm toán với mã giao dịch


LÀM BÀI

Points: 100
Time limit: 2.0s
Memory limit: 256M

Author:
Problem types
Allowed languages
C++

Tài khoản kiểm toán với mã giao dịch

Bối cảnh

Một tài khoản ngân hàng cần chống việc áp dụng cùng một transaction ID hai lần. Object có balance private và tập transaction đã xử lý. Lệnh:

  • DEPOSIT tx amount: amount>0, tx chưa dùng.
  • WITHDRAW tx amount: amount>0, tx chưa dùng, đủ balance.
  • ROLLBACK tx newTx: chỉ rollback một transaction đã thành công trước đó và chưa rollback; thao tác đảo ngược ảnh hưởng balance. Nếu rollback là withdrawal thì cộng lại tiền; nếu là deposit thì chỉ thành công khi balance vẫn đủ để trừ số tiền deposit cũ. newTx phải chưa dùng và sau rollback được đánh dấu đã dùng.
  • BALANCE: in balance.

Mỗi transaction thành công phải được lưu record nội bộ để rollback đúng một lần. Bài Advanced yêu cầu encapsulation state phức tạp và lịch sử giao dịch. friend có thể dùng cho auditor nhưng không bắt buộc; trọng tâm là invariant và rollback atomic — fail không được sửa một nửa state.

Vì đây là phần encapsulation, mọi field tạo nên invariant cần được đặt sau một interface kiểm soát. Một command thất bại phải là thao tác atomic: state trước và sau phải giống nhau hoàn toàn. Khi có nhiều field liên quan, nên viết rõ điều kiện hợp lệ trước rồi mới thực hiện bất kỳ phép gán nào.

Yêu cầu

  1. Class Account private balance và map lịch sử.
  2. Transaction ID unique cho mọi successful command.
  3. ROLLBACK atomic.
  4. In OK/FAIL cho mutation; BALANCE query.

Input

Dòng 1 initial q; q command.

Output

Mỗi command một dòng.

Ràng buộc

0≤initial≤1e12, q≤5000, tx token.

Ví dụ 1

Input

100 8
DEPOSIT T1 50
WITHDRAW T2 30
BALANCE
ROLLBACK T2 R2
BALANCE
ROLLBACK T2 R3
DEPOSIT T1 5
BALANCE

Output

OK
OK
120
OK
150
FAIL
FAIL
150

Giải thích

Deposit T1 làm150; withdraw T2 làm120. Rollback T2 cộng lại30 thành150 và đánh T2 inactive, R2 used. Rollback T2 lần nữa fail; deposit lại ID T1 fail vì ID đã tồn tại. Balance cuối150.

Ví dụ này còn kiểm tra nguyên tắc atomic của interface: khi một điều kiện không đạt, object không được giữ lại thay đổi dở dang. Các dòng output vì vậy không chỉ phản ánh OK/FAIL mà còn xác nhận state sau mỗi command vẫn thỏa invariant của class.

Ví dụ 2

Input

0 6
DEPOSIT A 10
WITHDRAW B 10
ROLLBACK A RA
BALANCE
ROLLBACK B RB
BALANCE

Output

OK
OK
FAIL
0
OK
10

Giải thích

Deposit A10 rồi withdraw B10 đưa balance về0. Rollback A muốn đảo deposit bằng cách trừ10 nhưng balance không đủ nên fail atomic. Rollback B sau đó cộng lại10 thành công; balance cuối10.

Ví dụ này còn kiểm tra nguyên tắc atomic của interface: khi một điều kiện không đạt, object không được giữ lại thay đổi dở dang. Các dòng output vì vậy không chỉ phản ánh OK/FAIL mà còn xác nhận state sau mỗi command vẫn thỏa invariant của class.

Thông tin học tập

  • Module: M07
  • Buổi: B25
  • Loại bài: ADVANCED
  • Độ khó: Hard
  • Concepts: class, private state, transaction ids, map, invariant, rollback, friend audit optional
  • Giới hạn kiến thức: B01-B25
  • Time limit: 2 second(s)
  • Memory limit: 256 MB
  • Point: 100

Comments

There are no comments at the moment.

Zalo