题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种。

思路:用AC自动机,利用AC自动机上的节点做矩阵乘法。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#define MOD 100000
char s[];
int ch(char x){
if (x=='A') return ;
if (x=='C') return ;
if (x=='G') return ;
if (x=='T') return ;
return -;
}
struct Trie{
int fail[],next[][],end[],L,root;
int newnode(){
for (int i=;i<;i++)
next[L][i]=-;
end[L++]=-;
return L-;
}
void clear(){
L=;
root=newnode();
}
void insert(char s[]){
int len=strlen(s),now=root;
for (int i=;i<len;i++){
if (next[now][ch(s[i])]==-) next[now][ch(s[i])]=newnode();
now=next[now][ch(s[i])];
}
end[now]=;
}
void build(){
std::queue<int>Q;
int now;
for (int i=;i<;i++)
if (next[root][i]==-)
next[root][i]=root;
else{
fail[next[root][i]]=root;
Q.push(next[root][i]);
}
while (!Q.empty()){
now=Q.front();Q.pop();
if (end[fail[now]]==) end[now]=;
for (int i=;i<;i++){
if (next[now][i]==-) next[now][i]=next[fail[now]][i];
else{
fail[next[now][i]]=next[fail[now]][i];
Q.push(next[now][i]);
}
}
}
}
}ac;
struct Matrix{
int n,mx[][];
Matrix(){}
Matrix(int x){
n=x;
for (int i=;i<n;i++)
for (int j=;j<n;j++)
mx[i][j]=;
}
};
Matrix operator *(Matrix a,Matrix b){
int n=a.n;
Matrix c=Matrix(n);
for (int i=;i<n;i++)
for (int j=;j<n;j++)
for (int k=;k<n;k++){
int tmp=(long long) a.mx[i][k]*b.mx[k][j]%MOD;
c.mx[i][j]=(c.mx[i][j]+tmp)%MOD;
}
return c;
}
Matrix powm(Matrix t,int m){
Matrix r=Matrix(t.n);
for (int i=;i<=t.n;i++)
r.mx[i][i]=;
while (m){
if (m%) r=r*t;
t=t*t;
m/=;
}
return r;
}
int main(){
int m;
int n;
while (scanf("%d%d",&n,&m)!=EOF){
ac.clear();
for (int i=;i<n;i++){
scanf("%s",s);
ac.insert(s);
}
ac.build();
Matrix a=Matrix(ac.L);
for (int i=;i<ac.L;i++)
for (int j=;j<;j++)
if (ac.end[ac.next[i][j]]==-)
a.mx[i][ac.next[i][j]]++;
a=powm(a,m);
int ans=;
for (int i=;i<a.n;i++)
ans=(ans+a.mx[][i])%MOD;
printf("%d\n",ans);
}
}

POJ 2778 DNA Sequence (AC自动机,矩阵乘法)的更多相关文章

  1. poj 2778 DNA Sequence ac自动机+矩阵快速幂

    链接:http://poj.org/problem?id=2778 题意:给定不超过10串,每串长度不超过10的灾难基因:问在之后给定的长度不超过2e9的基因长度中不包含灾难基因的基因有多少中? DN ...

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

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

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

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

  4. poj 2778 DNA Sequence AC自动机

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

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

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

  6. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

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

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

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

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

  9. POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

    这两题属于AC自动机的第二种套路通过矩阵快速幂求方案数. 题意:给m个病毒字符串,问长度为n的DNA片段有多少种没有包含病毒串的. 根据AC自动机的tire图,我们可以获得一个可达矩阵. 关于这题的t ...

随机推荐

  1. perl 学习笔记

    一:基础 1:安装perl      centos: yum -y install perl       官网:https://www.perl.org/      升级到5.22:先下载,执行./i ...

  2. Codeforces Round #327 (Div. 1) D. Top Secret Task

    D. Top Secret Task time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  3. HashMap Collision Resolution

    Separate Chaining Use data structure (such as linked list) to store multiple items that hash to the ...

  4. 升级 pip版本

    安装第三方库:pip install Pillow 出现 You are using pip version 7.1.2, however version 9.0.1 is available. Yo ...

  5. eclipse 集成maven插件

    本文转载自:http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 环境准备: eclips ...

  6. AVR32开发环境搭建

    下面是搭建AVR32开发环境的过程记录: 1.AVR32的编译环境下载  (到这里下载  as5installer-stable-5.1.208-full.exe) 如果你在安装的过程中碰到如下问题: ...

  7. samba常用命令

    1.# smbstatusSamba version 3.6.23PID Username Group Machine ---------------------------------------- ...

  8. 安装VMware Sphere ESXi 5.5

    安装VMware Sphere ESXi 5.5 1.准备 待安装ESXi 5.5的机器需要大于2GB以上内存,并且支持64位和虚拟化. 下载:VMware-VMvisor-Installer-5.5 ...

  9. 高可用集群(HA)配置

    高可用集群(HA) 1. 准备工作 HA的心跳监测可以通过串口连接监测也可以通过网线监测,前者需要服务器有一个串口,后者需要有一个空闲网卡.HA架构中需要有一个共享的存储设备首先需要在两台机器上安装m ...

  10. Javascript高级程序设计读书笔记(第二章)

    第二章  在HTML中使用Javascript 2.1<script>元素 延迟脚本(defer = "defer")表明脚本在执行时不会影响页面的构造,脚本会被延迟到 ...