题意
已知字符集大小 ∣∑∣=A,计算字符串对 (S,T) 的数目,满足:
- ∣S∣=N,∣T∣=M
- T 是 S 的一个子串.
答案对 109+7 取模.
对于所有数据,满足 1≤N≤200,1≤M≤50,M≤N,1≤A≤1000.
每个测试点具体限制见下表。
测试点编号 |
N |
M |
A |
分值 |
1 |
≤10 |
≤10 |
=2 |
5 |
2 |
≤50 |
=N−1 |
≤1000 |
10 |
3 |
≤50 |
=N−2 |
≤1000 |
20 |
4 |
≤200 |
≤5 |
≤1000 |
15 |
5 |
≤200 |
≤50 |
≤1000 |
50 |
题解
考虑枚举T在那个位置第一次成为S的子串,这要求S在前面的位置都不出现T,即减去前面出现T的方案,如果前面出现的位置和该位置没有交集是好算的,但如果有交集就比较麻烦,且与T本身的形态有关。考虑如果前面也出现了T且与该位置有交集的时候,T必须是交集的前面一段一直循环的结果,形式化地可以表示成一段前缀和一段后缀相等(这比循环要方便得多)。于是我们只需要知道T的哪些长度的前缀会与后缀相等,感觉上这样的情况种类不会很多,于是我们直接暴搜出每个长度是否合法的所有情况,事实证明这只有2249个,然后对每种情况直接DP容斥即可。