DTOJ 4886. 字符串计数

题意

已知字符集大小 ∣ ∑ ∣ = 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 1N200,1M50,MN,1A1000.

每个测试点具体限制见下表。

测试点编号 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 =N1 ≤ 1000 \le 1000 1000 10 10 10
3 3 3 ≤ 50 \le 50 50 = N − 2 =N-2 =N2 ≤ 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容斥即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值