It’s well known that DNA Sequence is a sequence only contains A, C, T and G, and it’s very useful to analyze a segment of DNA Sequence,For example, if a animal’s DNA sequence contains segment ATC then it may mean that the animal may have a genetic disease. Until now scientists have found several those segments, the problem is how many kinds of DNA sequences of a species don’t contain those segments.

Suppose that DNA sequences of a species is a sequence that consist of A, C, T and G,and the length of sequences is a given integer n.

Input:
First line contains two integer m (0 <= m <= 10), n (1 <= n <=2000000000). Here, m is the number of genetic disease segment, and n is the length of sequences.

Next m lines each line contain a DNA genetic disease segment, and length of these segments is not larger than 10.

Output
An integer, the number of DNA sequences, mod 100000.

题意:
输入n和m
下面n行每行给出一个字符串。(其中字符只有四种‘A’,‘T’,‘C’,‘G’)。
有多少个不同的字符串(字符串中不包含这n个字符串之一)。

思路:
这是一个由[‘ACG’]和[‘C’]组成的AC自动机fail树。根据题目的意思,字符是只有四种的。除了失配边外,我们还要把这些没有后继节点的也按失配边处理了。比如说4号节点,对于[‘A’,‘T’,‘C’,‘G’]都是不存在的。那么直接按失配处理了。(刘汝佳书中有详细介绍)。
这样,问题转化成走m步,并且每一步都是安全的。我们首先找出一步之内能到达的路径。然后使用矩阵快速幂。这样就可以求出m步的状况。
注意:对于u节点,val[u]=0;但是val[f[u]]!=0;这个时候val[u]也要处理为1.(可以回想一下fail树是干嘛的,因为以f[u]结尾的串是以u结尾的串的字串。或者说找到u就找到了f[u]。可以详细看一下刘汝佳书上对这段的描写。)
AC代码:

#include<bits/stdc++.h>
#include<iostream>
#include<stdio.h>
#include<algorithm>
#define MAXN 101000
#define ssize  200010
#define SIGMA_SIZE 200
#define mod 100000
using namespace std;
typedef long long LL;int trie[105][5],val[105];
int f[105],last[105],n,m,tot;
char str[15];struct matrix
{LL a[105][105];void Init(){memset(a,0,sizeof(a));}
};matrix mutimatrix(matrix& a,matrix& b)
{matrix c;c.Init();for(int i=0;i<tot;i++){for(int j=0;j<tot;j++){for(int k=0;k<tot;k++){c.a[i][j]+=a.a[i][k]*b.a[k][j];if(c.a[i][j]>mod)c.a[i][j]%=mod;}}}return c;
}
int getnum(char c)
{if(c=='A')return 0;else if(c=='T')return 1;else if(c=='C')return 2;return 3;
}void init()
{tot=1;memset(f,0,sizeof(f));memset(val,0,sizeof(val));memset(last,0,sizeof(last));
}void Insert(char *str,int v)
{int len=strlen(str);int root=0;for(int i=0;i<len;i++){int id=getnum(str[i]);if(!trie[root][id]){memset(trie[tot],0,sizeof(trie[tot]));val[tot]=0;trie[root][id]=tot++;}root=trie[root][id];}val[root]=v;
}void getfail()
{queue<int> q;f[0]=0;for(int c=0;c<4;c++){int u=trie[0][c];if(u){q.push(u);f[u]=0;last[u]=0;}}while(!q.empty()){int r=q.front();q.pop();for(int c=0;c<4;c++){int u=trie[r][c];if(!u){trie[r][c]=trie[f[r]][c];continue;}q.push(u);int v=f[r];f[u]=trie[v][c];last[u]=val[f[u]]?f[u]:last[f[u]];val[r]|=val[f[r]];}}
}void solve()
{matrix A;A.Init();for(int i=0;i<tot;i++){if(val[i])continue;for(int j=0;j<4;j++){int v=trie[i][j];if(!val[v]){A.a[i][v]++;}}}matrix ans;ans.Init();for(int i=0;i<tot;i++)ans.a[i][i]=1;while(n){if(n&1)ans=mutimatrix(ans,A);A=mutimatrix(A,A);n>>=1;}LL sum=0;for(int i=0;i<tot;i++){sum=sum+ans.a[0][i];if(sum>mod)sum%=mod;}printf("%lld\n",sum);
}int main()
{while(scanf("%d %d",&m,&n)!=EOF){init();for(int i=0;i<m;i++){scanf("%s",str);Insert(str,1);}getfail();solve();}return 0;
}

E - DNA Sequence POJ - 2778相关推荐

  1. 【POJ No. 2778】DNA 序列 DNA Sequence

    [POJ No. 2778]DNA 序列 DNA Sequence 北大OJ 题目地址 [题意] DNA序列是一个只包含A.C.T和G的序列.分析DNA序列片段非常有用,若动物的DNA序列包含片段AT ...

  2. HDU 1560 DNA sequence(DNA序列)

    HDU 1560 DNA sequence(DNA序列) Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K  ...

  3. POJ 2778 DNA Sequence [AC自动机 + 矩阵快速幂]

    http://poj.org/problem?id=2778 题意:给一些只由ACGT组成的模式串,问有多少种长度为n且不含有给出的模式串的DNA序列. 自动机的状态转换可以看成一个有向图(有重边的) ...

  4. poj 2778 DNA Sequence

    http://poj.org/problem?id=2778 AC自动机 + 矩阵连乘 代码: #include<iostream> #include<cmath> #incl ...

  5. POJ 2778 DNA Sequence (自动机DP+矩阵快速幂)

    题意:给出m个致病DNA片段,求长为n且不含致病片段的DNA序列共有多少种. 数据范围:0 <= m <= 10,1 <= n <=2000000000 这题初看起来与上一题差 ...

  6. POJ 2778 DNA Sequence —— (AC自动机+矩阵快速幂)

    距离上次做AC自动机有很久了=.=,以前这题的思路死活看不懂,现在还是觉得很好理解的. 思路参见:http://blog.csdn.net/morgan_xww/article/details/783 ...

  7. POJ 2778 DNA Sequence (AC自动机+矩阵快速幂)

    题目链接 MMM个病毒串,求长度为NNN的不包含病毒的字符串种类数 思路 把所有的病毒串建ACACAC自动机,failfailfail指针指向的节点如果标记过(包含病毒串)当前也是不合法串 . 然后我 ...

  8. POJ - 2778 DNA Sequence(AC自动机+矩阵快速幂)

    题目链接:点击查看 题目大意:给出 n 个长度不大于 10 的字符串表示病毒串,再给出一个长度 len ,问长度为 len 的字符串中,有多少个字符串不含有病毒串作为子串 题目分析:因为病毒串的长度和 ...

  9. data矩阵poj 2778 DNA Sequence

    最近研究data矩阵,稍微总结一下,以后继续补充: ac自动机处理字符串,dp计算谜底,用矩阵来减速 每日一道理 巴尔扎克说过"不幸,是天才的进升阶梯,信徒的洗礼之水,弱者的无底深渊&quo ...

最新文章

  1. 日积月累真的很可怕,记住这些编程单词,两周学会敲代码
  2. matlab实现BCC异或,C#编程之C# BCC异或校验法
  3. 自动化运帷之分布式监控 zabbix 使用
  4. POJ 2593解题报告
  5. 系统性能分析从入门到进阶
  6. html协商缓存没起作用,用了CDN缓存,就会跳过强缓存和协商缓存吗?
  7. kylin操作系统是什么
  8. .NET Framework也可以开发托管了
  9. 爬取豆瓣电影储存到数据库MONGDB中以及反反爬虫
  10. deepin photoshop_体验国产操作系统深度deepin一个月,谈谈使用感受!
  11. POI 在 word中 画图 以及图例刷新
  12. Clang vs Other Open Source Compilers
  13. android底层优化什么意思,华为所谓的“优化”到底是什么意思 看完这段你就明白...
  14. 2016/7/4日-你若安好,便是晴天.
  15. 1033:计算线段长度
  16. hive-5(窗口函数)
  17. 基于V4L2的视频驱动开发
  18. FLASH脚本基础入门讲解1
  19. php artisan 计划任务,Laravel artisan命令及任务调度
  20. 阿里云没有「引路人」

热门文章

  1. More than 4094 XFs (styles)
  2. 从“真快乐”APP看国美的野心,不止娱乐零售
  3. 腾讯企业 html邮件模板,python连接腾讯企业邮箱发送html邮件
  4. 开源流媒体服务器SRS环境搭建
  5. 吕梁市人民政府刘晋萍副市长率团访问启迪控股
  6. 使用nc获取服务器文件
  7. 组图:广州一战士救人牺牲 轻生者后悔大哭
  8. 手机泰拉瑞亚在线联机服务器ip,泰拉瑞亚1.4版本如何用IP联机
  9. SpringBoot项目中使用set方法后,自动保存问题
  10. 8.1~8.2 周末翻倍奖励——滴滴快车单