trang chủ / bài tập / tapeprog

Lập trình băng giấy

Đề bài

Mô tả

Xét một ngôn ngữ lập trình đơn giản, trong đó mỗi chương trình là một dãy không rỗng gồm các ký tự "<", ">" và các chữ số.

Bộ thông dịch của ngôn ngữ hoạt động dựa trên một con trỏ lệnh gồm hai phần:

  • Con trỏ ký tự hiện tại (CP) — chỉ tới một ký tự trong dãy.
  • Con trỏ hướng (DP) — có thể trỏ sang trái hoặc phải.

Ban đầu CP trỏ tới ký tự ngoài cùng bên trái của dãy, còn DP trỏ sang phải.

Ta lặp lại các bước sau cho đến thời điểm đầu tiên mà CP trỏ ra ngoài dãy:

  • Nếu CP đang trỏ vào một chữ số, bộ thông dịch in chữ số đó ra, sau đó CP dịch một bước theo hướng của DP. Sau khi dịch, giá trị của chữ số vừa in trong dãy giảm đi 1. Nếu chữ số vừa in là 0 thì nó không thể giảm thêm, nên ký tự đó bị xóa khỏi dãy và độ dài dãy giảm đi 1.
  • Nếu CP đang trỏ vào "<" hoặc ">", DP đổi hướng tương ứng thành trái hoặc phải. Sau đó CP dịch một bước theo DP. Nếu ký tự mới mà CP trỏ tới cũng là "<" hoặc ">" thì ký tự trước đó (ký tự vừa rời khỏi) bị xóa khỏi dãy.

Khi CP đi ra ngoài dãy, chương trình kết thúc. Có thể chứng minh mọi chương trình trong ngôn ngữ này đều kết thúc sau hữu hạn bước.

Cho dãy s1,s2,,sn gồm các ký tự "<", ">" và chữ số. Bạn cần trả lời q truy vấn. Mỗi truy vấn cho hai số lr và hỏi: nếu chạy dãy con sl,sl+1,,sr như một chương trình độc lập theo ngôn ngữ trên thì mỗi chữ số được in ra bao nhiêu lần.

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên nq — độ dài dãy s và số truy vấn.
  • Dòng thứ hai chứa dãy s gồm các ký tự "<", ">" và chữ số (0..9), viết liền nhau không có dấu cách.
  • q dòng tiếp theo, mỗi dòng chứa hai số nguyên liri — truy vấn thứ i.

Dữ liệu ra

Với mỗi truy vấn, in ra 10 số nguyên cách nhau bởi dấu cách: x0,x1,,x9, trong đó xi là số lần bộ thông dịch in ra chữ số i khi chạy chương trình tương ứng. In đáp án theo đúng thứ tự các truy vấn.

Ràng buộc

  • 1n,q100
  • 1lirin

Ví dụ

Input Output Giải thích
7 4
1>3>22<
1 3
4 7
7 7
1 7
0 1 0 1 0 0 0 0 0 0
2 2 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
2 3 2 1 0 0 0 0 0 0
Truy vấn 1 chạy "1>3": in 1 rồi 3, mỗi số một lần. Truy vấn 3 chạy "<": gặp ngay ký tự hướng, CP dịch ra ngoài nên không in gì.
1 1
0
1 1
1 0 0 0 0 0 0 0 0 0 Chạy "0": in 0 một lần (nên x0=1), CP dịch sang phải ra ngoài dãy, kết thúc.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0