canuc80k2014·15/50

Tổng Độ Dài Tiền Tố Chung

Nộp bài trên LQDOJ

Bài 20 · Trie

Tính tổng độ dài tiền tố chung dài nhất của mọi cặp chuỗi ở hai vị trí khác nhau trong danh sách.

Với hai chuỗi và là độ dài đoạn đầu dài nhất mà hai chuỗi giống nhau hoàn toàn. Mỗi cặp vị trí được tính đúng một lần, kể cả khi và có cùng nội dung.

Input

  • Dòng đầu chứa số nguyên .
  • dòng tiếp theo, dòng thứ chứa chuỗi ; hai dòng có thể chứa chuỗi giống nhau.

Output

  • In một số nguyên duy nhất là tổng với mọi .

Constraints

  • .
  • Mỗi là một chuỗi không rỗng chỉ gồm các chữ cái thường .
  • Tổng độ dài của chuỗi không vượt quá .
  • là số ký tự liên tiếp giống nhau tính từ đầu hai chuỗi; giá trị có thể bằng và bằng toàn bộ độ dài chuỗi ngắn hơn.
  • Kết quả có thể vượt quá phạm vi số nguyên bit; cần dùng kiểu số nguyên bit.

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

5
sun
sum
s
moon
sun

Output

10

Giải thích: Các cặp có đóng góp khác lần lượt cho và ký tự chung; tổng là . Hai dòng sun ở vị trí khác nhau vẫn tạo một cặp hợp lệ.

Lời giải tóm tắt
  • Ý tưởng: Chèn các chuỗi lần lượt vào Trie. Khi đi qua một nút, số chuỗi trước đó đã đi qua nút chính là số cặp mới có thêm một ký tự LCP; cộng số đó vào đáp án rồi tăng bộ đếm của nút.
  • Tính đúng đắn: Một cặp chuỗi đóng góp 1 cho mỗi độ sâu mà cả hai cùng đi qua một nút Trie. Khi chèn chuỗi thứ j, trước khi tăng pass tại một nút, pass chính là số chuỗi i < j đã đi qua nút đó; cộng pass đếm đúng các cặp mới có chung tiền tố tới độ sâu ấy. Cộng trên mọi nút và mọi j vì thế đếm mỗi đơn vị LCP của mỗi cặp đúng một lần.
  • Độ phức tạp: Tổng thời gian và bộ nhớ đều O(S), với S là tổng độ dài các chuỗi.
  • Đối chứng nhỏ: Trên dữ liệu nhỏ, duyệt mọi cặp i < j và so sánh từ đầu cho đến ký tự khác nhau hoặc hết một chuỗi. Đây là mô hình độc lập được dùng cho mười test nhỏ.