Codeforces - 877B - Nikita and string
★ Today's tune: https://youtu.be/UVmWLJVMBa8
★ Link: https://codeforces.com/contest/877/problem/B
★ Tags: prefix sum
★ Difficulty: 1500 (much easier than this rating)
★ Today's tune: https://youtu.be/64_O0cvQs0M
★ Tóm tắt:
Cho xâu s chỉ gồm các ký tự "a" và "b". Định nghĩa một xâu đẹp là xâu khi cắt thành 3 phần (có thể rỗng) thì phần đầu và phần cuối chỉ gồm ký tự "a", và phần giữa chỉ gồm ký tự "b". Từ xâu s có thể xoá một số ký tự để thu được một xâu đẹp. Yêu cầu tìm độ dài lớn nhất có thể của xâu đẹp thu được.
★ Ý tưởng: sử dụng prefix sum để đếm số ký tự "a" và "b".
Gọi prefA[i] là số ký tự "a" xuất hiện từ đầu xâu s đến vị trí i (s[1...i]).
Gọi prefB[i] là số ký tự "b" xuất hiện từ đầu xâu s đến vị trí i (s[1...i]).
Suy ra để đếm số ký tự "a" từ đoạn i + 1 --> j ta sẽ lấy prefA[j] - prefA[i], tương tự với ký tự "b".
Ta nhận xét xâu thu được sẽ có một trong các dạng sau:
...ABA... (TH chính)
...BBA... (TH1)
...AAA... (TH2)
...ABB... (TH3)
...BBB... (TH4)
Từ đây có thể chạy 2 vòng for để xét vị trí từ: 1 --> i, i + 1 --> j, j + 1 --> n (TH chính).
Lưu ý có thêm các trường hợp :
TH1: rỗng, 1 --> j, j + 1 --> n (phần đầu rỗng).
TH2: 1 --> i, rỗng, i + 1 --> n (phần giữa rỗng).
TH3: 1 --> i, i + 1 --> n, rỗng (phần cuối rỗng).
TH4: rỗng, 1 --> i, rỗng (phần đầu và cuối đều rỗng).
Các bạn có thể xem hình để hiểu rõ hơn.
Comments
Post a Comment