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容斥即可。

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