题意:给定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. TVS管

    1.原理 TVS二极管在线路板上与被保护线路并联,当瞬时电压超过电路正常工作电压后,TVS二极管便产生雪崩,提供给瞬时电流一个超低电阻通路,其结果是瞬时电流透过二极管被引开,避开被保护元件,并且在电压 ...

  2. SQL判断一个数是整数还是小数

    DECLARE @number1 AS numeric(10,2),@number2 AS numeric(10,2) SELECT @number1=10.00,@number2=10.2 SELE ...

  3. NOI2015

    D1T1 并查集. #include<cstdio> #include<cstdlib> #include<iostream> #include<fstrea ...

  4. poj2723-Get Luffy Out

    一道2-SAT问题,每对钥匙需要加一条边,每扇门上的对应的要用的钥匙加一条边. 其实求解2-SAT问题,关键在于找到不能同时成立的条件,例如在本题中,每对钥匙不能同时使用,每扇门上的钥匙不能同时不使用 ...

  5. day49

    几天没写了 这几天比较麻木呢 各种课程的再看 想买一直不舍得money 今天下定决心买了 这样我也静下心好好备战把 一天背的东西好多 政治和作文也是背了就忘记 尽力把 今天的买的课很悬乎 就不在这说了 ...

  6. <PHP>字符串处理代码

    字符串处理:        strlen("aaa");取字符串的长度 ***    strcmp("aaa","aaa");比较两个字符串 ...

  7. CPU使用率统计办法

    我们在搞性能测试的时候,对后台服务器的CPU利用率监控是一个常用的手段.服务器的CPU利用率高,则表明服务器很繁忙.如果前台响应时间越来越大,而后台CPU利用率始终上不去,说明在某个地方有瓶颈了,系统 ...

  8. Quartz定时调度CronTrigger时间配置格式说明与实例

    1.   CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 ...

  9. python网络请求简洁之道--python requests简介

    #requests中文文档:http://cn.python-requests.org/en/latest/#学习出处:http://mp.weixin.qq.com/s?__biz=MjM5NzU0 ...

  10. (转)iOS7界面设计规范(3) - UI基础 - 启动与退出

    周二晚间来第三发,搞得好像今天是周六的赶脚.发掉之后再奖励自己一点冰啤酒吧,然后扑床去.天气热起来了,各位注意防暑降温呗.走起. 重要:这是针对于正在开发中的API或技术的预备文档(预发布版本).虽然 ...