POJ1204 Word Puzzles AC自动机

 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】

 

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

 

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

 

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

 

无论如何,加油!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值