canuc80k2000·1/50

Kho Từ Động

Nộp bài trên LQDOJ

Bài 20 · Trie

Duy trì một kho từ ban đầu rỗng, hỗ trợ thêm từ, kiểm tra một từ đã được thêm và kiểm tra có từ nào mang một tiền tố cho trước.

Lệnh chỉ đúng khi toàn bộ đã được thêm trước đó. Lệnh đúng khi tồn tại ít nhất một từ đã thêm bắt đầu bằng ; bản thân không nhất thiết là một từ hoàn chỉnh.

Input

  • Dòng đầu chứa số thao tác .
  • Mỗi trong dòng tiếp theo chứa một lệnh insert, search hoặc prefix và một chuỗi .

Output

  • Với mỗi lệnh search hoặc prefix, in YES nếu điều kiện tương ứng đúng, ngược lại in NO.

Constraints

  • .
  • .
  • Mọi ký tự của thuộc .
  • Tổng độ dài các chuỗi trong toàn bộ thao tác không vượt quá .

Scoring

  • Subtask ( số điểm): và tổng độ dài các chuỗi không vượt quá .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

10
insert can
search can
search ca
prefix ca
insert cap
prefix cat
insert ca
search ca
prefix c
search cap

Output

YES
NO
YES
NO
YES
YES
YES

Giải thích: Sau khi thêm can, chuỗi ca mới chỉ là tiền tố nên search ca trả NO, còn prefix ca trả YES. Việc thêm ca về sau đánh dấu chính nút đó là một từ hoàn chỉnh; cap cũng được tìm thấy ở truy vấn cuối.

Lời giải tóm tắt
  • Ý tưởng: Trie 26 nhánh; terminal đánh dấu từ hoàn chỉnh. Mỗi thao tác duyệt đúng một lần theo chuỗi.
  • Tính đúng đắn: Mỗi đường từ gốc biểu diễn đúng một tiền tố đã xuất hiện trong một lần chèn. Cờ terminal chỉ được đặt sau ký tự cuối, nên search đúng khi và chỉ khi đường tồn tại và cờ này bật; prefix chỉ cần đường tồn tại.
  • Độ phức tạp: Mỗi thao tác tốn O(|s|) thời gian; bộ nhớ O(S) với S là tổng độ dài các từ đã chèn.
  • Đối chứng nhỏ: Lưu các từ đã thêm trong vector; search tìm bằng nhau và prefix quét xem có từ nào bắt đầu bằng chuỗi hỏi. Đây là cách độc lập với lời giải Trie và được dùng cho mười test nhỏ.