Censored! AC自动机+dp
Source
URAL - 1158
ACM ICPC 2001. Northeastern European Region, Northern Subregion
My Solution
题意:给出n个不同的字符,用这n个字符构成长度为m的字符串,要求每个串的子串都不出现给定的p个串中的任一个,求满足要求的字符串的个数。
AC自动机+dp
因为构成的最终串是由一个字符一个字符添加到字符串尾部构成的,那么如果一个串的后缀如果恰好是某个给定串的前缀时,这个串就可能最终成为非法串。
用k个给定串建立AC自动机,然后从根节点开始递推,
dpij表示递推到第j个字符当前在自动机上的i号节点时的方案数,如果下一个节点是k,且不是危险节点,则把dpij加到dp[k][i+1]里,
跑一遍,然后答案就是所有非危险节点的方案数的和(其实危险节点上都是0)。因为危险节点是给定串的终点或者其后缀节点是危险节点的点,遍历到危险节点的点上的方案必定是包含了给定串的方案,故不能记录这些。
此外这里dpij会很多,故要用高精度整数。笔者自己收藏的大整数类的版,可行长太长了,所以MLE了一发,调小了才过。⊙﹏⊙‖∣
复杂度 O(n^3)
#include
#include
#include
#include
#include
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
共有 0 条评论