trang chủ / đề bài / voi19_comstr

Nén xâu

Đề bài

Mô tả

Trong quá trình luyện tập cho cuộc thi học sinh giỏi sắp tới, Hùng được thầy giáo giao cho thử sức giải bài toán nén xâu kí tự (chỉ gồm các kí tự la tinh in hoa) sau đây.

Phép cộng trên hai xâu x và y, kí hiệu là x+y, được hiểu là ghép xâu y liền sau xâu x. Xuất phát từ hai xâu u,v và số nguyên k, xâu Fk được tạo theo luật sau (còn được gọi là luật tựa Fibonacci):

F1=u; F2=v; F3=F2+F1; …; Fk=Fk−1+Fk−2.

Ví dụ, với hai xâu u= AB, v= C và k=5 ta có: F1= AB, F2= C, F3= CAB, F4= CABC, F5= CABCCAB.

Giả sử xâu T có độ dài n là xâu được tạo theo luật trên từ hai xâu xuất phát uT,vT có độ dài tương ứng là n1,n2. Như vậy, vT là xâu gồm n2 kí tự đầu tiên của xâu T và uT là xâu gồm n1 kí tự tiếp theo của xâu T. Xâu T có thể được nén thành bộ (uT,vT,n) vì từ 3 thông tin uT,vT và n ta có thể khôi phục được xâu T theo luật trên. Ví dụ xâu T= CABCCAB có thể được nén thành bộ (AB, C, 7).

Một xâu S bất kì có độ dài m cũng có thể được nén theo cách như trên. Với hai số nguyên dương m1,m2 (m1+m2≤m), gọi vS là xâu gồm m2 kí tự đầu tiên của xâu S và uS là xâu gồm m1 kí tự tiếp theo trên xâu S. Khi đó, xâu S có thể được nén thành bộ (uS,vS,m). Tuy nhiên, từ 3 thông tin uS,vS và m ta có thể không khôi phục được chính xác xâu S. Do đó, người ta đánh giá độ lỗi của phương pháp nén xâu này như sau. Với bộ (uS,vS,m), tạo xâu Fk với k nhỏ nhất mà độ dài Fk lớn hơn hoặc bằng m theo luật tựa Fibonacci từ hai xâu xuất phát F1=uS, F2=vS. Độ lỗi của việc nén xâu S được tính bằng số lượng vị trí i mà S[i] khác với Fk[i], trong đó S[i] và Fk[i] tương ứng là kí tự thứ i của xâu S và xâu Fk với i≤m.

Ví dụ, với m1=2 và m2=1, xâu S= CABACC có độ dài m=6 được nén thành bộ (AB, C, 6), sau đó tạo ra xâu F5= CABCCAB. Khi đó độ lỗi của việc nén xâu S là 2 do có hai kí tự ở các vị trí thứ 4 và thứ 6 của S và F5 là khác nhau.

Nhận thấy rằng m2+m1 kí tự đầu tiên của xâu S ảnh hưởng rất lớn đến độ lỗi của việc nén xâu. Vì vậy, người ta tiến hành thay đổi không quá r kí tự trong m2+m1 kí tự đầu tiên của xâu S để biến xâu S thành xâu S* sao cho độ lỗi của việc nén xâu S* là nhỏ nhất. Việc thay đổi một kí tự là thay kí tự đó bởi một kí tự khác.

Yêu cầu: Cho các số nguyên m,m1,m2,r và xâu S, hãy tìm cách thay đổi không quá r kí tự trong m2+m1 kí tự đầu tiên của xâu S để biến xâu S thành xâu S* sao cho độ lỗi của việc nén xâu S* là nhỏ nhất.

Dữ liệu vào

  • Dòng thứ nhất chứa bốn số nguyên m,m1,m2,r cách nhau bởi dấu cách (0≤r≤m2+m1≤m; m1,m2≥1);
  • Dòng thứ hai chứa xâu S độ dài m, xâu chỉ gồm các kí tự thuộc tập kí tự chữ cái la tinh in hoa (từ A đến Z).

Dữ liệu ra

In ra một số nguyên là độ lỗi nhỏ nhất tìm được.

Ràng buộc

  • m1,m2≥1; 0≤r≤m2+m1≤m≤105.
  • S chỉ gồm các chữ cái la tinh in hoa.

Subtasks

  • Subtask 1 (30% số test, 30% số điểm): r=0; m≤103;
  • Subtask 2 (40% số test, 40% số điểm): r=m1+m2≤10; m≤103 và xâu S chỉ gồm hai kí tự A và B;
  • Subtask 3 (30% số test, 30% số điểm): m≤105.

Ví dụ

Input Output Giải thích
6 2 1 1
CABAAC
1 Thay kí tự đầu tiên thành A được S*= AABAAC, nén thành bộ (AB, A, 6) và tạo ra F5= AABAAAB. Chỉ vị trí thứ 6 khác nhau nên độ lỗi là 1.
6 2 1 0
CABACC
2 Ví dụ trong đề: không được thay đổi kí tự nào, F5= CABCCAB khác S ở vị trí thứ 4 và thứ 6.

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.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0