如果你想真正的了解ac自动机,前提是了解kmp和trie树,注意其中的fail指针的用法;
做题的感悟:
个人觉得在构建fail指针的时候,可以通过fail指针的构建完成一些对数据的处理,比如一些没有被mark的状态mark掉,比如进行最短路径的转移等等,还有通过矩阵加速来解决问题
A. 病毒侵袭
AC自动机的水题,只要求判断主串中是否包含至多三个子串,并输出
B. 病毒侵袭持续中
求主串中各个子串出现的次数,每次进行匹配的时候保留当前状态,不断向上fail,对答案进行记录,因为每增加一个后缀就有可能多一个答案,注意预先处理fail指针的时候不需要进行过多的操作,以免多计算答案
D. DNA Sequence
长度为n的串不包含给定子串的个数有多少个,建立自动机构建状态,然后建立状态转移矩阵,用矩阵加速得到答案
E. Censored!
题解:同上题一样,构建自动机,来进行状态转移
G. Ring
题解:利用dp构建包含所有子串的字典序最小的字符串
H. DNA repair
题解:最少修改多少次,使得主串中不包含子串,dp进行状态转移
J. Lost’s revenge
题解:重新构建字符串使得字符串包含的子串数最多,注意不能使用多维数组因为造成大量的空间浪费,通过状态压缩来表示状态。
K. Resource Archiver
题解:给定要求包含的子串和不允许包含的子串,求得到的串最小长度,利用dp进行状态转移