Hướng dẫn cho Mật khẩu (DHBB CT)


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: admin

Từ xâu \(T\) ta tách thành 2 mảng sau:

  • \(c[i]\): ký tự thứ i (từ tập kí tự \(a...z\))
  • \(s[i]\): số lượng ký tự liên tiếp tương ứng

Gọi \(f[i][j]\) là số cách chọn khi xét đến vị trí \(i\) trong mảng \(c\), đã chọn xong đến ký tự thứ \(j\) trong xâu \(P\).

Ta có:
\(f[0][0]=1\).
\(f[i+1][j+t]+=f[i][j] * C(s[i+1],t)\) (đk: các ký tự từ \(j+1->j+t\) trong xâu \(P = c[i+1]\)).

Ta có thể tính \(C(s[i+1],t)\) trong \(O(1)\):

  • Chuẩn bị trước mảng \(nd[0...m]\) với \(nd[i]=i^{(1e9+7)}\)
  • \(C(n,k)=C(n,k-1) * (n-k+2)*nd[k+1]\)

Đpt: \(O(n * m*m)\)

Lời giải của BTC cuộc thi



Bình luận (1)

Sắp xếp theo
Tải bình luận...