写在前面
此题数据量居然才出到(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))。