`
huobengle
  • 浏览: 860611 次
文章分类
社区版块
存档分类
最新评论

POJ2778 - AC自动机+非递归的矩阵乘法

 
阅读更多

回想还是半个月前...跟着Matrix67的那文章做矩阵乘法....做到这题就卡住了...决心突破..这两周从Trie入门开始..到今天终于把这题给AC了...虽然这半个月做题量相比以前大大减少....但真正能初步掌握一种算法还是值得的...

首先这道题我是参考了几个解题报告的:

http://www.matrix67.com/blog/archives/276/

http://blog.csdn.net/dooder_daodao/article/details/6711186

如果需要具体思路请先看前面两篇..特别是后面一个题解很详细..并且代码很整洁...可以看出很多东西....

我就说下我做这题时出现的问题以及要注意的地方...

1、 ***A表示长度为4末位为A前三位任意但其不能是任意病毒的前缀..****代表长度为4每位都任意但其不能是任意病毒的前缀

2、Built_AC_Automation时word标记需要逆向的传递...

3、Built_AC_Automation时某个点没有哪个孩子不需要任何处理..而我开始是按POJ3691的方式处理的...

4、Built_Matrix时问题很多...这个矩阵的意义是各个前缀相互到达方案数...表示每个前缀添加一个字符能转化到另一个前缀的方案数..

5、Built_Matrix时...注意什么时候要对0点更新..也就是要找的点在其以及其当其不断向上Fail是都没有这个孩子...就要更新矩阵的0列...但如果这个过程中有某个点其孩子有但是其孩子是病毒点..那也不能更新矩阵的0列..应该不做任何操作..

6、Built_Matrix时...若在其或者其向上Fail的某个点的孩子找到了能更新的点...那在++后就不要继续向上Fail了...因为继续往上在找到的实际上还是最先找到的那个..会重复的加..

7、 矩阵乘法时不能用递归...递归会爆内存..所以只能将其拆分成二阶乘数的和..

8 、切记!!矩阵里每个单元要是long long的...因为10^5 * 10^5会爆int !!


好久没写这么长的代码了...特别是非模拟题..怀疑这是我非模拟题写的最长的..比网络流的还长...PS: 我构造矩阵时就先将没用的点给去了..也就是病毒点..P就是有用点的从0到P.

Program:



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics