给定一个字符串$S$,只包含$’0’$和$’1’$两个字符,求有多少长度为$n$的字符串$T$,满足以$T$为循环节的无限循环字符串包含$S$。 注意,哪怕在循环后相同,写出来不同的字符串$T$仍算不同的字符串$T$。例如$10$和$01$算不同的字符串$T$。
正着要考虑循环好几次,就很麻烦。
正难则反,我们需要的不包含,只需要头尾相连不包含即可不包含。
枚举前缀已经匹配到了$S$的前$[0,|S|),suf$,$dp[k][i][j]$表示从已经构造到地$k$个单词,并且从已经有的前缀匹配到$j$,原本匹配到了$i$。最后我要保证匹配到原本匹配到了$suf$即后缀有$suf$,答案是$\sum_{i} dp[n][suf][i]$。
- 这里问题就是正难则反。不能匹配放到AC自动机上就是不跑最后那个点,又因为是循环,我们为了保证连起来不搞到,所以就需要限制前后缀,不然难以统计。
代码
1 |
|