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