传送门

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 + 矩阵优化)的更多相关文章

  1. poj 2778 DNA Sequence AC自动机DP 矩阵优化

    DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11860   Accepted: 4527 Des ...

  2. [poj2778 DNA Sequence]AC自动机,矩阵快速幂

    题意:给一些字符串的集合S和整数n,求满足 长度为n 只含charset = {'A'.'T‘.'G'.'C'}包含的字符 不包含S中任一字符串 的字符串的种类数. 思路:首先对S建立ac自动机,考虑 ...

  3. POJ 2778 DNA Sequence (AC自动机+DP+矩阵)

    题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个. 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散 ...

  4. [poj2778]DNA Sequence(AC自动机+矩阵快速幂)

    题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列.(仅含A,T,C,G四个字符) 解题关键:AC自动机,实际上就是一个状态转移图,注意能少取模就少取模, ...

  5. POJ2778 DNA Sequence(AC自动机 矩阵)

    先使用AC自动机求得状态转移关系,再建立矩阵,mat[i][j]表示一步可从i到j且i,j节点均非终止字符的方案数,则此矩阵的n次方表示n步从i,到j的方法数. #include<cstdio& ...

  6. 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 ...

  7. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  8. POJ2278 DNA Sequence —— AC自动机 + 矩阵优化

    题目链接:https://vjudge.net/problem/POJ-2778 DNA Sequence Time Limit: 1000MS   Memory Limit: 65536K Tota ...

  9. POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )

    题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...

随机推荐

  1. WPF知识点全攻略07- 数据绑定(Binding)

    数据绑定是WPF不得不提,不得不会系列之一 数据绑定简言之,就是把数据源的数据绑定到目标对象的属性上.目标对象可以是承自DependencyProperty的任何可访问的属性或控件,目标属性必须为依赖 ...

  2. 四、绘图可视化之Seaborn

    Seaborn-Powerful Matplotlib Extension seaborn实现直方图和密度图 import numpy as np import pandas as pd import ...

  3. C基础:关于预处理宏定义命令

    为了程序的通用性,可以使用#define预处理宏定义命令,它的具体作用,就是方便程序段的定义和修改. 1.关于预定义替代 #define Conn(x,y) x##y#define ToChar(x) ...

  4. CPP-练习

    HW: 1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会 ...

  5. remote: Incorrect username or password ( access token ) fatal: Authentication failed for

    gitee推送到远程仓库时提示错误remote: Incorrect username or password ( access token )fatal: Authentication failed ...

  6. synchronized 和ReentrantLock的区别

    历史知识:JDK5之前,只有synchronized 可以用,之后就有了ReetrantLock可以用了 ReetrantLock (再入锁) 1.位于java.util.concurrnt.lock ...

  7. shell脚本,awk 匹配的做修改后打印,不匹配的打印。

    文件file内容如下a 1a 2b 3b 4 b 5c 6c 7 要求:第一列匹配b时,如果第二列大于3,那么将第二列加上1后打印,其余的原封不动打印.结果如下: a 1a 2b 3b 5 b 6c ...

  8. jdk环境变量配置(参考自《疯狂java讲义》)

    做个记录,免得每次配环境都要百度 环境变量的配置 path环境变量配置的作用:程序的执行需要使用外部指令javac, 但是javac指令仅仅能在JDK安装目录下的bin目录下使用,因此程序只能写入bi ...

  9. 用xtrabackup实现mysql的主从复制 阿里云rds到自己创建mysql

    来源 http://blog.51cto.com/825536458/1803968参考https://segmentfault.com/a/1190000003063874 如果我们用传统的mysq ...

  10. (9)zabbix创建监控项item

    1. 创建监控项 点击配置(configuration)->主机(Hosts)->在你要配置的主机一栏上点击Items->点击create item.具体看截图,各个参数我都已经标注 ...