Suppose that DNA sequences of a species is a sequence that consist of A, C, T and G,and the length of sequences is a given integer n.
题目的大意就是给定一组DNA的子序列,要我们计算长度为N的DNA序列中不包含这些子序列的数量有多少个。多串匹配的问题我们首先构造AC自动机,{ACG, C}如下图所示:
实线表示的是Trie的部分,虚线表示的是Fail指针(root的fail指针指向自己,这里我们未画出)。AC自动机表示了根据输入文本应该进行的状态转移,我们可以看到红色的状态是危险的状态,是我们无论如何都想避免到达的。如果我们把每个节点对应不同输入的状态转移画出来,可以得到对应的有向图:
对于一个节点,我们需要把对应的child指针指向接受输入之后应该指的方向。比如对于图中的1节点,输入a之后会走fail指针回到根节点0,但是fail指针的移动是不消耗输入字符的,所以我们可以继续move到a。所以对应的children[a]指针就应该指向a自身。同理对于0节点的children[t]和children[g],我们把他们指向root而不是留为nullptr。因为现在我们是对每个节点对应的每个输入建图,而不是仅仅保有在AC自动机的所拥有的边。建这个图的过程并不复杂,在我们建fail指针的时候,,对于所有不同的输入:
- 如果其有对应的子节点children[c],那么我么已经有有对应的边连接状态转移
- 如果其没有对应的子节点children[c],我们直接把其连向对应fail指针的对应子节点fail->children[c]。这里我们把root的fail指针设为root,这样一层一层下来的话,其一定可以指向对应c输入之后需要转向的节点。
No comments:
Post a Comment