DTOJ 4886. 字符串計數

題意

已知字符集大小 =A|\sum|=A,計算字符串對 (S,T)(S,T) 的數目,滿足:

  • S=N,T=M|S|=N,|T|=M
  • TTSS 的一個子串.

答案對 109+710^9+7 取模.

對於所有數據,滿足 1N200,1M50,MN,1A10001 \le N \le 200,1 \le M \le 50, M \le N, 1 \le A \le 1000.

每個測試點具體限制見下表。

測試點編號 NN MM AA 分值
11 10\le 10 10\le 10 =2=2 55
22 50\le 50 =N1=N-1 1000\le 1000 1010
33 50\le 50 =N2=N-2 1000\le 1000 2020
44 200\le 200 5\le 5 1000\le 1000 1515
55 200\le 200 50\le 50 1000\le 1000 5050

題解

考慮枚舉TT在那個位置第一次成爲SS的子串,這要求SS在前面的位置都不出現TT,即減去前面出現TT的方案,如果前面出現的位置和該位置沒有交集是好算的,但如果有交集就比較麻煩,且與TT本身的形態有關。考慮如果前面也出現了TT且與該位置有交集的時候,TT必須是交集的前面一段一直循環的結果,形式化地可以表示成一段前綴和一段後綴相等(這比循環要方便得多)。於是我們只需要知道TT的哪些長度的前綴會與後綴相等,感覺上這樣的情況種類不會很多,於是我們直接暴搜出每個長度是否合法的所有情況,事實證明這隻有22492249個,然後對每種情況直接DPDP容斥即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章