POJ1204 Word Puzzles AC自动机

来源:互联网 发布:阿里云 端口开放 编辑:程序博客网 时间:2024/04/27 19:14

 Problem Address:http://poj.org/problem?id=1204

 

【前言】

 

一道算是比较简单的AC自动机的题。

 

开始的时候,出于对第一份AC自动机代码的怀疑以及对上一份小变种的担忧,所有调试了好久。

 

现在发现,第一次的那份代码可靠性是极强的。

 

时限是5s,本来以为要跑很久,结果一出来1s都不到。爽快!

 

但是关于AC自动机的好多应用还是有很大难度的,还得继续努力学习。

 

【思路】

 

先简单地构造出AC自动机(以w个单词为词典)。

 

然后写查询函数。

 

简单地说,就是对puzzle里的每一个字母开始向八个方向形成八个字符串,在自动机中查询这些字符串以寻求匹配。

 

查询函数可参考:http://blog.csdn.net/Human_CK/archive/2011/06/27/6569992.aspx(只是参考)

 

对于给定的字符串,从根节点开始匹配,如果无法继续则转向其失败指针所指节点。

 

在匹配的过程中,如果发现某个节点是某个单词的结尾,即从根节点到该节点可形成一个单词,则说明在给定的字符串中匹配到了这个单词,把这个单词的开始位置以及其方向记录下来。记录过的单词可以标记,以便之后不再找到。不过由于这道题是Special Judge,所以有没有做这一步都无所谓,做了只是增加一点小开销罢了。

 

注意找到之后不能跳出循环,而应该继续搜索下去,否则无法达到要求。

 

如果对puzzle里的每个字母都进行八个方向的搜索,那么会有很多搜索是重复的。

 

比如从第一个字母向右,和从第二个字母向右,这两种情况,第一种是包含了第二种的。

 

所以可以总结为几种情况进行搜索。

 

当然,代码量也因此而有所增加。

 

【代码】

 

 

【P.S】

 

其实我觉得这份代码还是挺长的,有时候都没有勇气写这种代码。

 

但是,这毕竟是一条必经之路,如果想取得好成绩的话。

 

在以后,这种长度的代码也许是很常见的。

 

无论如何,加油!

 

原创粉丝点击