[POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)
AC自动机加DP就不说了
注意到 m <= 10,所以模式串很少。
而 n 很大就需要 log 的算法,很容易想到矩阵。
但是该怎么构建?
还是矩阵 A(i,j) = ∑A(i,k) * A(k,j),那么i到j的方案数就是j到k的方案数称k到j的方案数,那么直接矩阵快速幂即可
#include <queue>
#include <cstdio>
#include <cstring>
#define N 100001
#define p 100000
#define LL long long int n, m, cnt, ans;
int next[N][4], fail[N], f[101][N];
bool val[N];
char s[N];
std::queue <int> q; struct Matrix
{
int n, m;
LL a[141][141];
Matrix()
{
n = m = 0;
memset(a, 0, sizeof(a));
}
}res; inline int idx(char x)
{
if(x == 'A') return 0;
if(x == 'C') return 1;
if(x == 'T') return 2;
if(x == 'G') return 3;
} inline void insert()
{
int i, x, now = 0, len = strlen(s + 1);
for(i = 1; i <= len; i++)
{
x = idx(s[i]);
if(!next[now][x])
next[now][x] = ++cnt;
now = next[now][x];
}
val[now] = 1;
} inline void make_fail()
{
int i, now;
for(i = 0; i < 4; i++)
if(next[0][i])
q.push(next[0][i]);
while(!q.empty())
{
now = q.front();
q.pop();
for(i = 0; i < 4; i++)
{
if(!next[now][i])
{
next[now][i] = next[fail[now]][i];
continue;
}
fail[next[now][i]] = next[fail[now]][i];
val[next[now][i]] |= val[next[fail[now]][i]];
q.push(next[now][i]);
}
}
} inline Matrix operator * (Matrix x, Matrix y)
{
int i, j, k;
Matrix ret;
ret.n = x.n;
ret.m = y.m;
for(i = 0; i <= x.n; i++)
for(j = 0; j <= y.m; j++)
for(k = 0; k <= y.n; k++)
ret.a[i][j] = (ret.a[i][j] + x.a[i][k] * y.a[k][j]) % p;
return ret;
} inline Matrix operator ^ (Matrix x, int y)
{
int i;
Matrix ret;
res.n = ret.m = cnt;
for(i = 0; i <= cnt; i++) ret.a[i][i] = 1;
for(; y; y >>= 1)
{
if(y & 1) ret = ret * x;
x = x * x;
}
return ret;
} int main()
{
int i, j, k;
scanf("%d %d", &n, &m);
for(i = 1; i <= n; i++)
{
scanf("%s", s + 1);
insert();
}
make_fail();
res.n = res.m = cnt;
for(i = 0; i <= cnt; i++)
{
if(val[i]) continue;
for(j = 0; j < 4; j++)
if(!val[next[i][j]])
res.a[i][next[i][j]]++;
}
res = res ^ m;
for(i = 0; i <= cnt; i++)
ans = (ans + res.a[0][i]) % p;
printf("%d\n", ans);
return 0;
}
[POJ2778]DNA Sequence(AC自动机 + DP + 矩阵优化)的更多相关文章
- poj 2778 DNA Sequence AC自动机DP 矩阵优化
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
- [poj2778 DNA Sequence]AC自动机,矩阵快速幂
题意:给一些字符串的集合S和整数n,求满足 长度为n 只含charset = {'A'.'T‘.'G'.'C'}包含的字符 不包含S中任一字符串 的字符串的种类数. 思路:首先对S建立ac自动机,考虑 ...
- POJ 2778 DNA Sequence (AC自动机+DP+矩阵)
题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个. 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散 ...
- [poj2778]DNA Sequence(AC自动机+矩阵快速幂)
题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列.(仅含A,T,C,G四个字符) 解题关键:AC自动机,实际上就是一个状态转移图,注意能少取模就少取模, ...
- POJ2778 DNA Sequence(AC自动机 矩阵)
先使用AC自动机求得状态转移关系,再建立矩阵,mat[i][j]表示一步可从i到j且i,j节点均非终止字符的方案数,则此矩阵的n次方表示n步从i,到j的方法数. #include<cstdio& ...
- poj2778 DNA Sequence(AC自动机+矩阵快速幂)
Description It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's ve ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- POJ2278 DNA Sequence —— AC自动机 + 矩阵优化
题目链接:https://vjudge.net/problem/POJ-2778 DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Tota ...
- POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )
题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...
随机推荐
- android textview添加滚动条
给textview添加滚动条 方式一: xml代码: //设置滚动条的方向 android:scrollbars="vertical" java中设置 tView=(TextVie ...
- jenkins SVN更改密码后出现的坑爹问题
1.前提 公司SVN账号密码和AD账号密码是绑定在一起的,为了保证代码检出总是最新,jenkins中做代码检查前总会从SVN中检出最新代码. 最近公司要求AD账户不得使用原始密码,更改密码后,jenk ...
- HDU 1950 Bridging signals (LIS,O(nlogn))
题意: 给一个数字序列,要求找到LIS,输出其长度. 思路: 扫一遍+二分,复杂度O(nlogn),空间复杂度O(n). 具体方法:增加一个数组,用d[i]表示长度为 i 的递增子序列的最后一个元素, ...
- 洛谷 P2916 [USACO08NOV]为母牛欢呼Cheering up the Cows
题目描述 Farmer John has grown so lazy that he no longer wants to continue maintaining the cow paths tha ...
- 51nod 1174 区间中最大的数(送盾题)
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. ...
- 单调栈2 POJ3250 类似校内选拔I题
这个题再次证明了单调栈的力量 简单 单调栈 类似上次校内选拔消砖块 一堆牛面朝右排 给出从左到右的 问每个牛的能看到前面牛发型的个数之和 //re原因 因为在执行pop的时候没有判断empty 程序崩 ...
- STL:string类中size()与length()的区别
结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...
- readystatechange
// alternative to DOMContentLoaded document.onreadystatechange = function () { if (document.readySta ...
- CentOS 7.0关闭防火墙
.关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止fir ...
- dhtmlTree简单实例以及基本参数设置
demo实例参考: <link rel="STYLESHEET" type="text/css" href="css/dhtmlXTree.c ...