随笔分类 -  字符串算法-AC自动机

摘要:"题目链接" 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和。 cpp include include include include using namespace std; const int MAXK = 阅读全文
posted @ 2019-05-24 15:53 Qihoo360 阅读(193) 评论(0) 推荐(0)
摘要:"题目链接" AC自动机上dp第一题嗷。 如果直接求可读文本的数量,显然要容斥,不好搞。 于是考虑求不可读文本的数量,再用$26^m$减去其即可。 建出AC自动机,如果一个节点为单词结尾或其fail链中有节点为单词结尾,那么这个点就不能走,这个显然可以在bfs的时候顺便求出来。 然后就是大家熟知的方 阅读全文
posted @ 2019-05-18 10:37 Qihoo360 阅读(229) 评论(1) 推荐(0)
摘要:"题目链接" 这么多字符串,肯定是自动机啦。 先建出AC自动机,然后怎么表示一个安全代码没有病毒代码呢? 就是存在一条路径不经过有病毒代码段结尾的节点呗。 所以呢?有环啊!dfs一下救星了。 cpp include include include include using namespace st 阅读全文
posted @ 2019-05-17 22:06 Qihoo360 阅读(139) 评论(0) 推荐(0)
摘要:把单词连起来,中间插入间隔符, "同" cpp include include include using namespace std; struct Node{ int fail, next[27], num; }AC[200010]; int n, u, cnt; queue q; int p[ 阅读全文
posted @ 2019-05-17 21:26 Qihoo360 阅读(159) 评论(0) 推荐(0)
摘要:每次匹配都不停跳fail显然太慢了,于是在每个节点和fail指向的点连一条边,构成一棵树,在这棵树上差分一下就好了。 AC自动机 就这个算法而言其实没用想象中那么难。 cpp include include include using namespace std; struct Node{ int 阅读全文
posted @ 2019-05-17 20:54 Qihoo360 阅读(291) 评论(0) 推荐(0)

You're powerful!