BZOJ 4179 B

163 阅读1分钟

说实话,我是不相信这个故事的

题解

由于是字符串问题,所以我们就直接考虑各种自动机吧

愉快地pass掉其它各种鸡,我们选择了AC自动机

考虑假如在AC自动机中匹配某一段字符是否包含病毒序列

一段字符串有病毒当且仅当它包含一整段病毒序列

于是我们在构造时只需要考虑当构造到一个病毒序列的最后一个字符时跳过这个字符

而单纯跳过最后一个字符无法保证下一段不是病毒序列

我们需要跳到 fail 所在的点,因为这个点与当前的字符后缀相同,并且它只要不是病毒序列的最后一个点,那它一定能够保证当前匹配合法

顺一下思路

构建AC自动机,并且标记每一个病毒串的末尾

然后顺着根进行匹配,当匹配到标记时,跳到它的 fail 去,来保证当前序列的合法性

值得注意的是

当前的自动机内是可以有环的,如果这个字符环合法的话,那么我们就能够沿着这个环构建无限长的合法序列

而无环时,可以用深搜/类似于SPFA的方法寻找最长合法序列

就不附上代码了