canuc80k1900·1/50

Dấu Vân Tay Của Xâu

Nộp bài trên LQDOJ

Bài 19 · Hashing

Với mỗi chữ cái thường, đặt . Cho xâu có độ dài , dấu vân tay của xâu được định nghĩa bởi

Chỉ số ký tự bắt đầu từ . Hãy tính .

Input

  • Dòng đầu chứa số nguyên .
  • Dòng thứ hai chứa xâu gồm đúng chữ cái thường.

Output

  • In giá trị sau khi lấy phần dư theo .

Constraints

  • .
  • Mỗi ký tự của thuộc từ đến .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

5
abcde

Output

4739715

Giải thích: Năm ký tự có giá trị lần lượt . Thay chúng vào công thức và lấy phần dư theo cho kết quả .

Lời giải tóm tắt
  • Phân tích: Công thức yêu cầu cộng lần lượt value(s[i]) · 31^i. Giá trị lũy thừa tăng rất nhanh, vì vậy phải rút gọn theo modulo ngay trong quá trình tính.
  • Thuật toán: Khởi tạo power = 1 và answer = 0. Với từng ký tự từ trái sang phải, cộng value(s[i]) * power vào đáp án, lấy modulo, rồi cập nhật power = power * 31 mod M.
  • Chứng minh: Sau khi xử lý i ký tự đầu, answer bằng tổng các hạng tử từ vị trí 0 đến i-1 modulo M, còn power = 31^i mod M. Bất biến đúng lúc đầu và được duy trì sau mỗi bước, nên khi xử lý hết xâu, answer đúng bằng H(s).
  • Độ phức tạp: Thời gian O(n), bộ nhớ phụ O(1).