THAO TÁC ADN


Submit solution

Points: 4.2 (partial)
Time limit: 2.0s
JAVA11 3.0s
Pypy 3 3.0s
Memory limit: 67M
JAVA11 977M
Pypy 3 977M

Author:
Problem types
Allowed languages
Ada, Assembly, Awk, C, C++, C11, CLANG, CLANGX, Classical, COBOL, Coffee, CSC, D lang, DART, F95, FORTH, Fortrn, GAS32, GO, Haskell, Itercal, Java, kotlin, LEAN, LISP, LUA, MONOVB, Nasm, OCAML, Pascal, Perl, php, PIKE, prolog, Pypy, Python, Ruby 2, RUST, Scala, SCM, SED, SWIFT, TCL, TUR, V8JS, VB, ZIG

Vấn đề này được thiết kế theo các bài trong kì thi OLP tin học sinh viên, giới hạn (subtask) được xếp ở cuối.

ADN là phân tử mang thông tin di truyền quy định mọi hoạt động sống. Cấu trúc của ADN gồm hai mạch polynucleotide xoắn quanh nhau theo một trục chung. Mỗi polynucleotide bao gồm một chuỗi các đơn vị xây dựng gọi là nucleotide, trong mỗi nucleotide chứa một trong các bazonito: A - Adenin, C - Cytosin, G - Guanin hoặc T - Thymin. Bazonito ở hai mạch xoắn được liên kết với nhau theo nguyên tắc bổ sung:

  • A liên kết với T và ngược lại.
  • G liên kết với C và ngược lại.

Tiến sĩ Hérec cùng nhóm nghiên cứu của ông vừa tạo ra một máy cắt gen mới, gọi là XAE. Để xác định công hiệu của XAE, ông chuẩn bị một số đoạn gen trong môi trường nội bào tái lập - trong môi trường này, các mạch ADN sẽ được tự động bổ sung. Do đó, XAE chỉ cần theo dõi và thực hiện các thao tác chỉnh sửa trên một mạch ADN (gọi là mạch \(A\)), mạch còn lại (gọi là mạch \(B\)) sẽ được tự động xây dựng dựa theo nguyên tắc bổ sung như trên.

Yêu cầu

Thực hiện các phép xử lý với quy cách chuẩn như sau của máy XAE:

\(ADDR\:X\) – Bổ sung vào cuối mạch \(A\) đoạn gen \(X\), mạch \(B\) sẽ thay đổi tương ứng. Nếu như mạch \(A\) chưa tồn tại (rỗng) thì coi đoạn gen hiện tại là mạch \(A\).

\(ADDL\:X\) – Bổ sung vào đầu mạch \(A\) đoạn gen \(X\), mạch \(B\) sẽ thay đổi tương ứng. Nếu như mạch \(A\) chưa tồn tại (rỗng) thì coi đoạn gen hiện tại là mạch \(A\).

\(REMOVE\:\:i\) - Bỏ bazonito ở vị trí \(i\) \((1 \le i)\) trong mạch \(A\) và mạch \(B\) (mạch \(A\) bắt đầu từ vị trí \(1\)). Nếu thao tác này không thực hiện được do \(i\) quá lớn thì thông báo lỗi.

\(STAT\:l\:r\) - Thống kê số lượng các loại bazonito từ vị trí \(l\) tới vị trí \(r\) \((1 \le l \le r)\) trên mạch \(B\) (mạch \(B\) bắt đầu từ vị trí \(1\)). Nếu thao tác này không thực hiện được do \(r\) quá lớn thì thông báo lỗi.

Dữ liệu

Vào từ thiết bị nhập chuẩn với định dạng như sau:

  • Dòng đầu tiên chứa số nguyên \(q\) là số thao tác.
  • Mỗi dòng trong \(q\) dòng tiếp theo chứa thông tin theo quy cách đã nêu về một thao tác cần thực hiện.

Kết quả

Đưa ra thiết bị xuất chuẩn:

  • Đối với mỗi thao tác \(STAT\) (thực hiện được) bốn số nguyên trên một dòng lần lượt là số lượng bazonito A - T - G - C có trong đoạn mạch truy vấn.
  • Đối với mỗi thao tác \(STAT\) hay \(REMOVE\) không thực hiện được dòng chữ "ERROR".

Ví dụ

Dữ liệu vào:

8
ADDR ATGC
ADDR AA
REMOVE 1
REMOVE 100
STAT 1 3
ADDL TAT
STAT 1 100
STAT 1 8

Kết quả ra:

ERROR
1 0 1 1
ERROR
3 3 1 1

Giải thích:

  • Sau hai thao tác đầu tiên, mạch \(A\) là ATGCAA.
  • Sau thao tác thứ ba: TGCAA, mạch ADN tương ứng là ACGTT.
  • Sau thao tác thứ năm: TATTGCAA, mạch ADN tương ứng là ATAACGTT.

Giới hạn

Gọi \(L\) là tổng độ dài đoạn gen thêm vào trong các thao tác \(ADDL,\:ADDR\).

Subtask \(1\) \((30\%\) số điểm\()\): \(1 \le q, L \le 2000\).

Subtask \(2\) \((30\%\) số điểm\()\): \(1 \le q, L \le 2*10^5\), không có thao tác \(REMOVE\).

Subtask \(3\) \((40\%\) số điểm\()\): \(1 \le q, L \le 2*10^5\).

QDUY

Comments

There are no comments at the moment.