Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.
Author: LeKienThanh
tag: range dp, bitset, bitset tree, sentai decomposition.
Để việc giải thích đơn giản hơn thì với bộ dữ liệu thứ , đặt .
Subtask 1:
Ta cần chuẩn bị mảng , nếu thì đoạn là xâu đối xứng, không thì ngược lại. Ta có thể làm điều đó trong , với công thức truy hồi AND .
Khi đó, bài toán chỉ đơn thuần là một bài quy hoạch động cổ điển. Gọi là số chi phi ta giảm được khi thực hiện cả thao tác và trên đoạn thay vì chỉ sử dụng thao tác . Ví dụ với xâu AAAA, thì vì ta có thể xây dựng được xâu trong thao tác, thay vì nếu chỉ sử dụng thao tác .
Nếu , ta đặt . Khi đó, công thức truy hồi là .
Đáp án sẽ là . Ta có thể thực hiện phần quy hoạch động này trong .
Độ phức tạp: .
Subtask 2:
Với , thuật toán của chúng ta ở Subtask 1 sẽ bị chạy quá thời gian, vì vậy ta cần tăng tốc độ cho quy hoạch động.
Ta nhận thấy rằng cấu trúc dữ liệu bitset có thể tăng tốc độ của thuật toán của ta lên lần, nhưng như vậy là chưa đủ, vì bây giờ chương trình vẫn chạy trong khoảng phép tính, vẫn còn quá nhiều.
Ta sẽ sử dụng bitset hai lần, làm tăng tốc độ thuật toán lên lần. Như vậy, bây giờ chương trình sẽ chạy trong khoảng phép tính. Trên thực tế, thuật toán chạy rất nhanh, vì chúng ta chỉ xét những xâu đối xứng có độ dài chẵn. Đây chính là kỹ thuật Sentai Decomposition.
Độ phức tạp:
Comments