首页 > 技术文章 > Codeforces 1038F Wrap Around (Codeforces Round #508 (Div. 2) F) 题解

zbh2047 原文

写在前面

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

推荐阅读