[CSA49G][XSY3315] Bunny on Number Line (DP)
CSA49G
XSY3315
因為判斷兩串是否本質不同只看某幾項是不是好數,與究竟是哪個好數無關,所以考慮轉換一下題意:
給出一個長度為aka_kak?的01串SSS,第a1,a2,...,aka_1,a_2,...,a_ka1?,a2?,...,ak?項為1,其余項為0。
現要用若干個SSS的前綴拼出串TTT,使得TTT中有nnn個1,以1結尾,并且任意兩個1之間0的個數不超過mmm。問所有不同的TTT的長度之和為多少?
SSS如果用01串表示,會很長,發現kkk很小,考慮換一種表示方式:設bi=ai?ai?1b_i=a_i-a_{i-1}bi?=ai??ai?1?。我們把SSS串描述成{b1,b2,b3,...,bk}\{b_1,b_2,b_3,...,b_k\}{b1?,b2?,b3?,...,bk?},表示SSS由 (b1?1)(b_1-1)(b1??1)個0,1個1,(b2?1)(b_2-1)(b2??1)個0,1個1,…,(bk?1)(b_k-1)(bk??1)個0,1個1 拼接而成。
設g(x,i)g(x,i)g(x,i)表示目前有xxx個1,以 (bi?1)(b_i-1)(bi??1)個0+1個1 結尾的01串個數,
f(x,i)f(x,i)f(x,i)表示目前有xxx個1,以 (bi?1)(b_i-1)(bi??1)個0+1個1 結尾的01串長度之和。
可以列出dp式:
g(x,i)={g(x?1,i?1)i>1∑j=1kg(x?1,j)×(m?a[1]+1)i=1g(x,i)=\begin{cases}g(x-1,i-1)\qquad i>1\\\sum_{j=1}^{k}g(x-1,j)\times(m-a[1]+1)\qquad i=1\end{cases}g(x,i)={g(x?1,i?1)i>1∑j=1k?g(x?1,j)×(m?a[1]+1)i=1?
f(x,i)={f(x?1,i?1)+(a[i]?a[i?1])×g(x?1,i?1)i>1∑j=1kf(x?1,j)×(m?a[1]+1)+g(x?1,j)×(a[1]+m)(m?a[1]+1)2i=1f(x,i)=\begin{cases}f(x-1,i-1)+(a[i]-a[i-1])\times g(x-1,i-1)\qquad i>1\\\sum_{j=1}^{k}f(x-1,j)\times(m-a[1]+1)+g(x-1,j)\times\frac{(a[1]+m)(m-a[1]+1)}{2}\qquad i=1\end{cases}f(x,i)={f(x?1,i?1)+(a[i]?a[i?1])×g(x?1,i?1)i>1∑j=1k?f(x?1,j)×(m?a[1]+1)+g(x?1,j)×2(a[1]+m)(m?a[1]+1)?i=1?
把式子用矩陣快速冪優化一下,復雜度是O(k3logn)O(k^3logn)O(k3logn)
(ps.因為fff的轉移同時與f,gf,gf,g有關,所以通過矩乘轉移的過程有點特殊,具體可以看代碼。)
然而還有一個小小的問題:
假設a={2,6,7,9,13}a=\{2,6,7,9,13\}a={2,6,7,9,13},
那么S[1?13]=0100011010001S[1-13]=0100011010001S[1?13]=0100011010001,S[1?6]=010001S[1-6]=010001S[1?6]=010001,S[1?7]=0100011S[1-7]=0100011S[1?7]=0100011。
我們發現S[1?7]+S[1?6]=S[1?13]S[1-7]+S[1-6]=S[1-13]S[1?7]+S[1?6]=S[1?13],即若S[1?y]S[1-y]S[1?y]是S[1?x]S[1-x]S[1?x]的后綴,則S[1?x]S[1-x]S[1?x]可以由S[1?y]S[1-y]S[1?y],S[1?(x?y)]S[1-(x-y)]S[1?(x?y)]拼成。但仔細看上面的dp式就會發現S[1?7]+S[1?6]S[1-7]+S[1-6]S[1?7]+S[1?6]和S[1?13]S[1-13]S[1?13]被算成了兩個串。怎么辦?暴力預處理一下,對于前綴S[1?x]S[1-x]S[1?x],若有前綴S[1?y]S[1-y]S[1?y]同時是S[1?x]S[1-x]S[1?x]的后綴,則前綴S[1?x]S[1-x]S[1?x]不能取。
總結
以上是生活随笔為你收集整理的[CSA49G][XSY3315] Bunny on Number Line (DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cf区域怎么分的
- 下一篇: [XSY3320] string (AC