Problem Address:http://poj.org/problem?id=3691
【前言】
关于这道题,我看了好几天。
刚开始确实很不好理解,不知道如何动态规划法。
不过慢慢地就看懂了。
看了很多解题报告,不过写的都不是很清楚。无奈最后终于又看了代码,才渐渐了解过来。
我觉得,很多题目都不是简单地考察一个知识点,而是多个知识点的结合。而我们要学习的,也正是这种发现能力。
不多说,看思路。
【思路】
这道题我觉得主要是在构造AC自动机上,不是纯粹地构造。
当然,首先要正常地构造建立一棵Tire树(以所有病毒字符串为词典)。
接下来就是构造AC自动机了(先学习完AC自动机)。
使用BFS的形式构造。
注意点一:为每个结点构造失败指针的同时,检查其失败指针所指向的节点是否为危险节点,如果是的话也需要把当前节点标记为危险节点。
所谓的危险节点,就是指以当前节点为结尾的字符串是某个病毒串,或者包含了某个病毒串。如果在bfs的同时进行这项操作的时候就非常方便,在构造完当前失败指针的同时检查其所指向的节点是否为危险节点。
注意点二:如果某个节点的子节点不存在,则需要把它指向当前节点失