Editorial for Tèo và xâu đối xứng (Bản không dễ)


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.

Lời giải sẽ dùng các nhận xét từ lời giải ở bản dễ, cụ thể:

  • Vì chia hết cho 25, nên số đó phải chia hết cho 10, suy ra chữ số tận cùng luôn là 0.

  • Với mỗi số chia hết cho 3 thì tổng số chữ số của nó luôn chia hết cho 3.

Để giải quyết được bài toán, chúng ta xét một bản dễ hơn như sau:


Cho một xâu s (|s|2105), hãy đếm xem có bao nhiêu cặp (l,r) (lr) sao cho xâu slsl+1...sr là xâu đối xứng và có độ dài lẻ.

|s|2105 nên chúng ta không thể dùng quy hoạch động để giải quyết bài toán, cho nên ta cần một cách nhanh hơn để đếm số cặp.

Nhận thấy rằng, nếu xâu s là xâu đối xứng thì xâu s2s3...s|s|1 cũng là xâu đối xứng. Cho nên, với mỗi vị trí i, ta tìm độ dài len lớn nhất sao cho xâu silensilen+1...si...si+len1si+len là xâu đối xứng.

Để tìm được giá trị len, chúng ta có hai cách: chặt nhị phân và dùng hash để kiểm tra trong O(nlog2n), hoặc dùng thuật toán Manacher trong O(n).

Như vậy, đáp án của bài toán trên chỉ là tổng len+1 của mọi i.


Trở lại với bài toán chính, không chỉ kiểm tra xâu đối xứng mà chúng ta cần kiểm tra thêm xâu có chia hết cho 2,3,5.

Với mỗi i, ta chỉ xét những j (0jlen) sao cho tổng chữ số của sijsij+1...si...si+j1si+j chia hết cho 3si+j=0.

Chúng ta chia sijsij+1...si...si+j1si+j thành 3 phần:

  • Phần đầu: sijsij+1...si1.
  • Phần giữa: si.
  • Phần đuôi: si+1...si+j1si+j.

Gọi tổng chữ số của 3 phần lần lượt là sum1, sum2sum3. Chúng ta có nhận xét như sau:

Vì xâu đối xứng nên sum1=sum3. Vì vậy điều kiện để xâu chia hết cho 3sum2+sum320mod3.

Sau khi thử hết các giá trị modulo, ta rút ra được sum2=sum3.

Như vậy, với mỗi i, chúng ta cần đếm số j sao cho thỏa mãn:

  • 0(ji)len
  • sj=0
  • si+1+si+2+...+sjsimod3

Việc đếm j có thể giải quyết bằng tổng tiền tố.

ĐPT: O(n) nếu dùng Manacher, O(nlog2n) nếu dùng hash.


Comments

Please read the guidelines before commenting.


There are no comments at the moment.