写在前面

此题数据量居然才出到\(n=40\)???(黑人问号)以下给出一个串长\(|S|=100,n=10^9\)的题解。

题目描述

给一个长度不超过\(m\)的01串S,问有多少个长度不超过\(n\)的01串,使得首尾接起来形成的字符串环中至少出现一次\(S\)?

数据规模:\(m \le 100, n \le 10^9\)。

简要题解

若\(n<m\)显然答案为0。

对\(|S|\)建自动机。枚举长度为\(n\)的串最后匹配到哪个状态,那么我们就从这个状态出发,求长度为\(n\)的不经过结束状态的路径数。

如果预处理转移矩阵的\(n\)次方,那么每次枚举只需求从某个状态\(i\)出发回到\(i\)的方案数,这可以O(1)从矩阵中得到。注意到从状态\(i\)出发回到状态\(i\),那么必然从状态0出发也回到状态\(i\),因为串长\(n\)大于等于\(m\)。最终我们就求出了所有长为\(n\)的不出现\(|S|\)的串有几个。再用\(2^n\)减它即为答案。

总时间复杂度\(O(m^3 \log n)\)。

 

相关文章:

  • 2022-12-23
  • 2022-01-22
  • 2021-10-24
  • 2022-01-20
  • 2023-01-16
  • 2022-12-23
  • 2021-06-28
  • 2021-09-30
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-25
  • 2021-09-03
  • 2022-12-23
相关资源
相似解决方案