这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数。
题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的。
根据AC自动机的tire图,我们可以获得一个可达矩阵。
关于这题的tire图详解可以,往下面翻,这个博主的图对于tire图讲的非常详细。
知道了什么是tire图,理解了tire图后,后面的AC自动机的题目才能写。
AC自动机的灵魂应该就是tire图
然后问题就变成了,得到了一个可达矩阵后,如何求方案数呢?
这个n = 2000000000 这咋办呢?
给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值
这个是一个关于矩阵快速木的经典问题。
把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。
令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点)。
类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数。
同理,如果要求经过k步的路径数,我们只需要二分求出A^k即可。
是不是就是一个裸的矩阵快速幂了。
通过AC自动机得到可达矩阵,然后通过矩阵快速幂求方案数。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include
View Code
考研路茫茫――单词情结 HDU - 2243
这题和上题题意类似,做法一样。
上题是说长度为n的不包含m个模式串的方案数,这题求的是长度为1~n不包括m个模式串的方案数。
这题就在矩阵上面加上一列全为1的列,这个可以1保存了前面的方案书之和。
如果不理解的话,建议通过手算一下矩阵,去看看这个新加的一列有什么用。
这题是对2^64取模,所以直接用unsigned long long 自动溢出取模即可。
1 #include 2 #include
View Code