APIO 2008 - DNA

Xem PDF



Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 1800 (p) Thời gian: 1.0s Bộ nhớ: 128M Input: bàn phím Output: màn hình

Một ứng dụng thú vị của máy tính là phân tích dữ liệu sinh học, chẳng hạn các chuỗi DNA. Về mặt sinh học, một sợi DNA là chuỗi các nucleotide Adenine, Cytosine, Guanine và Thymine, lần lượt được biểu diễn bằng các ký tự A, C, GT. Vì vậy, một sợi DNA có thể được biểu diễn bằng một xâu gồm bốn ký tự này, gọi là một chuỗi DNA.

Đôi khi các nhà sinh học không thể xác định một số nucleotide. Khi đó, ký tự N được dùng để biểu diễn một nucleotide chưa biết: nó có thể là bất kỳ một ký tự nào trong A, C, G, T. Một chuỗi có ít nhất một ký tự N được gọi là chuỗi chưa hoàn chỉnh; ngược lại, đó là chuỗi hoàn chỉnh. Một chuỗi hoàn chỉnh được gọi là phù hợp với chuỗi chưa hoàn chỉnh nếu có thể thu được nó bằng cách thay mỗi ký tự N bằng một trong bốn nucleotide. Chẳng hạn, ACCCT phù hợp với ACNNT, còn AGGAT thì không.

Các nucleotide được sắp thứ tự như trong bảng chữ cái tiếng Anh:

\[ \mathtt{A}<\mathtt{C}<\mathtt{G}<\mathtt{T}. \]

Một chuỗi DNA thuộc dạng 1 nếu mỗi nucleotide trong chuỗi bằng hoặc đứng trước nucleotide ngay bên phải nó theo thứ tự trên. Ví dụ, AACCGT thuộc dạng 1, còn AACGTC thì không.

Với \(j>1\), một chuỗi thuộc dạng \(j\) nếu nó thuộc dạng \(j-1\), hoặc là phép nối một chuỗi dạng \(j-1\) với một chuỗi dạng 1. Ví dụ, AACCC, ACACCACACA đều thuộc dạng 3, còn GCACACACACACA thì không.

Các chuỗi DNA được sắp theo thứ tự từ điển, như cách sắp các từ trong từ điển. Chẳng hạn, chuỗi dạng 3 đầu tiên có độ dài \(5\)AAAAA, và chuỗi cuối cùng là TTTTT. Với chuỗi chưa hoàn chỉnh ACANNCNNG, bảy chuỗi dạng 3 đầu tiên phù hợp với nó, theo thứ tự, là ACAAACAAG, ACAAACACG, ACAAACAGG, ACAAACCAG, ACAAACCCG, ACAAACCGGACAAACCTG.

Hãy tìm chuỗi dạng \(K\) đứng thứ \(R\) theo thứ tự từ điển trong số các chuỗi hoàn chỉnh phù hợp với chuỗi chưa hoàn chỉnh cho trước có độ dài \(M\). Thứ tự được đánh số bắt đầu từ \(1\).

Dữ liệu vào

Dòng đầu chứa ba số nguyên \(M,K,R\).

Dòng thứ hai chứa xâu độ dài \(M\) biểu diễn chuỗi chưa hoàn chỉnh, gồm các ký tự A, C, G, T, N.

Bảo đảm tổng số chuỗi dạng \(K\) phù hợp với chuỗi đã cho không vượt quá \(4\cdot 10^{18}\), và \(R\) không vượt quá tổng số này.

Dữ liệu ra

In trên một dòng chuỗi dạng \(K\) đứng thứ \(R\) phù hợp với chuỗi đã cho.

Ràng buộc

\[ 1\le M\le 50\,000,\qquad 1\le K\le 10,\qquad 1\le R\le 2\cdot 10^{12}. \]

Các giá trị lớn trong bài cần được lưu bằng kiểu số nguyên 64 bit: long long trong C/C++ hoặc Int64 trong Pascal. Trong C/C++, có thể đọc và ghi long long bằng scanf("%lld", &a)printf("%lld\n", a); Pascal không cần cách đọc, ghi đặc biệt cho Int64.

Giới hạn thời gian: \(1\) giây. Giới hạn bộ nhớ: \(128\) MB. Một bộ dữ liệu chỉ được tính điểm khi kết quả hoàn toàn đúng.

Phân nhóm

Mỗi phân nhóm được chấm độc lập theo kiểu tất cả hoặc không: bạn chỉ nhận điểm của nhóm khi đúng toàn bộ test trong nhóm. Điểm trong bảng là phần điểm cộng thêm trên LQDOJ; nhóm sau bao gồm lại các test thỏa điều kiện của nhóm trước.

Nhóm Điểm Ràng buộc bổ sung
1 20 \(M\le 10\)
2 80 Không có ràng buộc bổ sung

Ví dụ

Ví dụ 1

Input
9 3 5
ACANNCNNG
Output
ACAAACCCG

Ví dụ 2

Input
5 4 10
ACANN
Output
ACAGC

Nguồn

Olympic Tin học châu Á – Thái Bình Dương 2008, bài DNA.

Tệp

Bình luận

Mới nhất
Tải bình luận...

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

Kỳ thi: