USACO 2024 US Open Contest, Silver, The 'Winning' Gene

Xem PDF

Điểm: 1000 (p) Thời gian: 2.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Sau những năm tổ chức game show của mình và nhìn Bessie giành lấy giải nhất liên tục, nông dân John nhận ra đây không hề là ngẫu nhiên mà là to Bessie đã được cấy mã gen của kẻ chiến thắng. Để giải nhất không rơi vào tay Bessie thêm nữa, nông dân John đã bắt đầu công cuộc tìm kiếm gen của kẻ chiến thắng.

Nhiệm vụ của bạn là giúp anh nông dân John xác định mã gen ưng ý thông qua các bước sau: Từ xâu \(S\) có độ dài \(N\) (\(1 \leq N \leq 3000\)) là mã gen của Bessie, anh ấy chọn vài cặp số nguyên \((K,L)\) (\(1 \le L \le K \le N\)) mô tả mã gen "chiến thắng" có độ dài \(L\) và có thể thu được từ một xâu con độ dài \(K\) của xâu \(S\). Ta định nghĩa \(k-mer\) là tập hợp gồm các xâu con có độ dài \(K\) của xâu \(S\). Với mỗi phần tử của \(k-mer\), anh ấy viết ra tất cả xâu con có độ dài bằng \(L\) của nó, chọn ra xâu có thứ tự từ điển nhỏ nhất là một ứng cử viên cho mã gen "chiến thắng" (nếu tồn tại nhiều xâu con có thứ tự từ điển nhỏ nhất, chọn xâu có vị trí đầu tiên nhỏ nhất) và thêm vị trí xuất hiện lần đầu của nó trong xâu S \(p_i\) (các vị trí đánh số từ \(0\)) vào trong tập hợp \(P\).

Do quá gấp gáp, anh John vẫn chưa chọn được \(K\)\(L\) nên anh ấy muốn bạn tìm ra số ứng cử viên cho mỗi cặp \(K\)\(L\) anh ấy đưa ra.

Với mỗi \(v\) trong đoạn từ 1 đến \(N\), hãy giúp anh ấy tìm số cặp \(K, L\) thoả mãn \(|P| = v\).

Input:

  • Dòng đầu tiên chứa \(N\), mô tả độ dài của chuỗi.
  • Dòng thứ hai chứa chuỗi \(S\) (\(s_i \in A - Z\) \(\forall i \in [0, n - 1]\)).

Output:

  • Đối với mỗi \(v\) từ \(1\) đến \(N\), in ra số lượng cặp \((K, L)\) với \(|P| = v\), mỗi số trên một dòng riêng biệt.

Scoring:

  • Subtask 1: \(N \leq 100\)
  • Subtask 2: \(N \leq 500\)
  • Subtask 3: Không có ràng buộc gì thêm

Test 1

Input
8
AGTCAACG
Output
11
10
5
4
2
2
1
1
Note

Trong test case này, có thể thấy dòng thứ 3 có kết quả là 5 vì có chính xác 5 cặp \(K\)\(L\) có thể mô tả gen "chiến thắng":

  • \((4,2) \to P = [0,3,4]\)
  • \((5,3) \to P = [0,3,4]\)
  • \((6,4) \to P = [0,3,4]\)
  • \((6,5) \to P = [0,1,3]\)
  • \((6,6) \to P = [0,1,2]\)

Để thấy vì sao cặp \((4,2)\) cho ra kết quả này, chúng ta lấy tất cả các \(k\)-mer dài 4:

  • AGTC
  • GTCA
  • TCAA
  • CAAC
  • AACG

Đối với mỗi \(k\)-mer dài 4, chúng ta xác định xâu con nhỏ nhất theo thứ tự từ điển có độ dài 2:

  • AGTC \(\to\) AG
  • GTCA \(\to\) CA
  • TCAA \(\to\) AA
  • CAAC \(\to\) AA
  • AACG \(\to\) AA

Chúng ta lấy vị trí xuất hiện đầu tiên của tất cả các xâu con này trong chuỗi gốc và thêm chúng vào tập hợp \(P\) để có \(P = [0,3,4]\).

Ngược lại, nếu chúng ta tập trung vào cặp \((4,1)\), sẽ được kết quả là đến 2 ứng cử viên gen thắng cuộc tổng cộng. Nếu chúng ta lấy tất cả các \(k\)-mer dài 4 và xác định chuỗi chú nhỏ nhất theo thứ tự từ điển có độ dài 1 (ở đây, kí hiệu A' và A* để phân biệt các xâu "A" khác nhau), chúng ta có:

  • AGTC \(\to\) A
  • GTCA' \(\to\) A'
  • TCA'A* \(\to\) A'
  • CA'A*C \(\to\) A'
  • A'A*CG \(\to\) A'

Mặc dù cả A' và A* đều nhỏ nhất theo thứ tự từ điển trong ba trường hợp cuối, xâu con bên trái nhất được ưu tiên, vì vậy A' được tính là ứng cử viên duy nhất trong tất cả các trường hợp này. Điều này có nghĩa là \(P = [0,4]\).


Bình luận

Không có bình luận nào.