POJ 2778 ac自动机+矩阵快速幂
来源:互联网 发布:js时间滑动选择插件 编辑:程序博客网 时间:2024/05/22 08:13
DNA Sequence
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 10757 Accepted: 4104
Description
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.
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.
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.
Sample Input
4 3ATACAGAA
Sample Output
36
ac自动机+矩阵快速幂。
sb错误纠结一晚上,吐槽一下。
/* ***********************************************Author :xianxingwuguanCreated Time :2014-2-2 22:56:06File Name :1.cpp************************************************ */#pragma comment(linker, "/STACK:102400000,102400000")#include <stdio.h>#include <iostream>#include <algorithm>#include <sstream>#include <stdlib.h>#include <string.h>#include <limits.h>#include <string>#include <time.h>#include <math.h>#include <queue>#include <stack>#include <set>#include <map>using namespace std;#define INF 0x3f3f3f3f#define eps 1e-8#define pi acos(-1.0)typedef long long ll;const ll mod=100000;struct Matrix{ll n,mat[200][200];Matrix(){}Matrix(ll _n){n=_n;for(ll i=0;i<n;i++)for(ll j=0;j<n;j++)mat[i][j]=0;}};Matrix mul(Matrix a,Matrix b){Matrix ans=Matrix(a.n);for(ll i=0;i<a.n;i++)for(ll j=0;j<a.n;j++)for(ll k=0;k<a.n;k++)ans.mat[i][j]=(ans.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod;return ans;}Matrix pw(Matrix a,ll n){Matrix ans=Matrix(a.n); for(ll i=0;i<a.n;i++)ans.mat[i][i]=1;while(n){if(n%2)ans=mul(ans,a);a=mul(a,a);n>>=1;}return ans;}struct Trie{ll next[300][4],fail[300],end[300];ll L,root;ll newnode(){for(ll i=0;i<4;i++)next[L][i]=-1;end[L++]=0;return L-1;}void init(){L=0;root=newnode();}ll id(char ch){if(ch=='A')return 0;if(ch=='T')return 1;if(ch=='C')return 2;return 3;}void insert(char *str){ll len=strlen(str);ll now=root;for(ll i=0;i<len;i++){ll p=id(str[i]);if(next[now][p]==-1)next[now][p]=newnode();now=next[now][p];}end[now]=1;}void build(){queue<ll> q;fail[root]=root;for(ll i=0;i<4;i++)if(next[root][i]==-1)next[root][i]=root;else {fail[next[root][i]]=root;q.push(next[root][i]);}while(!q.empty()){ll now=q.front();q.pop();if(end[fail[now]])end[now]=1;for(ll i=0;i<4;i++)if(next[now][i]==-1)next[now][i]=next[fail[now]][i];else {fail[next[now][i]]=next[fail[now]][i];q.push(next[now][i]);}}}Matrix solve(){Matrix ans=Matrix(L);for(ll i=0;i<L;i++)if(!end[i])for(ll j=0;j<4;j++)if(!end[next[i][j]])ans.mat[i][next[i][j]]++;return ans;}}ac;char str[1000];void debug(Matrix a){cout<<"111: "<<a.n<<endl;for(ll i=0;i<a.n;i++){for(ll j=0;j<a.n;j++)cout<<a.mat[i][j]<<" ";cout<<endl;}}int main(){ //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); ll i,j,k,m,n; while(cin>>n>>m){ ac.init(); while(n--){scanf("%s",str);ac.insert(str); }// cout<<"hahha:"<<endl; ac.build(); Matrix ans=ac.solve();// debug(ans); ans=pw(ans,m); ll ret=0; for(i=0;i<ac.L;i++) ret=(ret+ans.mat[0][i])%mod; cout<<ret<<endl; } return 0;}
0 0
- poj 2778 AC自动机+矩阵快速幂
- poj 2778 AC 自动机 + 矩阵快速幂
- POJ 2778 ac自动机+矩阵快速幂
- poj 2778 AC自动机 + 矩阵快速幂
- poj 2778 AC自动机+矩阵快速幂
- poj 2778(ac自动机+矩阵快速幂)
- AC自动机+矩阵快速幂 POJ 2778
- POJ 2778 (AC自动机 矩阵快速幂)
- POJ-2778 ac自动机+矩阵快速幂
- POJ 2778 AC自动机+矩阵快速幂
- POJ 2778:DNA Sequence(AC自动机+矩阵快速幂)
- poj 2778 DNA Sequence 【ac自动机 + dp + 矩阵快速幂】
- poj 2778 AC自动机+DP+矩阵快速幂
- POJ 2778 DNA Sequence【AC自动机+矩阵快速幂】
- poj 2778 (AC自动机+dp+矩阵快速幂)
- poj 2778 DNA Sequence(AC自动机+矩阵快速幂)
- [AC自动机+dp+矩阵快速幂] poj 2778 DNA Sequence
- poj 2778 ac自动机dp矩阵快速幂
- select模型 writefds 测试
- 进程地址空间和内存文件映射
- Struts2 的token原理
- Confluence 评论(Comment)
- 使用JAXP的DOM方式解析XML文档(能力工场)
- POJ 2778 ac自动机+矩阵快速幂
- 用51模拟I2C从机程序-改动实测OK
- Linux进程间通信——使用共享内存
- Confluence 分享和提及(Share and Mention)
- 明天同学聚会
- linux kernel(四)中断
- mysql数据的access denied for user rootlocalhost问题
- linux SSD 硬盘优化
- Evaluate Reverse Polish Notation