日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > poj 2778 AC自動機與矩陣連乘

poj 2778 AC自動機與矩陣連乘

來源:程序員人生   發布時間:2015-06-08 08:31:11 閱讀次數:3335次

http://poj.org/problem?id=2778

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. 

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.

Sample Input

4 3 AT AC AG AA

Sample Output

36
/** poj 2778 AC自動機與矩陣連乘 題目大意:給定1些模式串,問可以構造出多少中長度為n且不含模式串中的任何1個作為子串的字符串 解題思路:構造自動機,寫出狀態轉移的矩陣,進行矩陣快速冪,其n次冪就表示長度為n。然后mat[0][i]就表示從根節點到狀態點i長度為n的字符串有多少種 */ #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> #include <queue> using namespace std; const int MOD=100000; struct Matrix { int mat[110][110],n; Matrix() {} Matrix(int _n) { n=_n; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { mat[i][j]=0; } } } Matrix operator *(const Matrix &b)const { Matrix ret=Matrix(n); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { for(int k=0; k<n; k++) { int tmp=(long long)mat[i][k]*b.mat[k][j]%MOD; ret.mat[i][j]=(ret.mat[i][j]+tmp)%MOD; } } } return ret; } }; struct Trie { int next[110][4],fail[110],end[110]; int root,L; int newnode() { for(int i=0; i<4; i++) next[L][i]=⑴; end[L++]=0; return L⑴; } void init() { L=0; root=newnode(); } int getch(char ch) { if(ch=='A') return 0; if(ch=='C') return 1; if(ch=='G') return 2; return 3; } void insert(char *s) { int len=strlen(s); int now=root; for(int i=0; i<len; i++) { if(next[now][getch(s[i])]==⑴) next[now][getch(s[i])]=newnode(); now=next[now][getch(s[i])]; } end[now]=1; } void build() { queue <int>Q; for(int i=0; i<4; i++) { if(next[root][i]==⑴) next[root][i]=root; else { fail[next[root][i]]=root; Q.push(next[root][i]); } } while(!Q.empty()) { int now=Q.front(); Q.pop(); if(end[fail[now]]==1) end[now]=1; for(int i=0; i<4; 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]); } } } } Matrix getMatrix() { Matrix res=Matrix(L); for(int i=0; i<L; i++) { for(int j=0; j<4; j++) { if(end[next[i][j]]==0) res.mat[i][next[i][j]]++; } } return res; } } ac; char buf[20]; Matrix pow_M(Matrix a,int n) { Matrix ret=Matrix(a.n); for(int i=0; i<ret.n; i++) { ret.mat[i][i]=1; } Matrix tmp=a; while(n) { if(n&1)ret=ret*tmp; tmp=tmp*tmp; n>>=1; } return ret; } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { ac.init(); for(int i=0;i<n;i++) { scanf("%s",buf); ac.insert(buf); } ac.build(); Matrix a=ac.getMatrix(); a=pow_M(a,m); int ans=0; for(int i=0;i<a.n;i++) { ans=(ans+a.mat[0][i])%MOD; } printf("%d ",ans); } return 0; }


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩欧美在线观看 | 欧美日韩免费一区二区三区 | 日韩视频三区 | 久久精品一区二区三区不卡牛牛 | 在线激情片 | 青青草亚洲 | 国产精品久久久久久久久久久久冷 | 香蕉视频一区二区三区 | 成人黄色片免费看 | 日韩中文视频 | 五月综合激情网 | 日韩精品视频免费在线观看 | 国产精品videosex极品 | 欧美三区| 国产精品伦一区二区三级视频 | 午夜专区 | 午夜精品在线 | a毛片| 久久久综合精品 | 午夜精品影院 | www.com.cn成人 | 国产超碰人人做人人爽aⅴ 亚州国产 | 国产一区二区在线免费 | 亚洲男人天堂视频 | 99热99精品 | 亚洲 欧美日韩 国产 中文 | 欧美专区一区 | 中文一区二区视频 | 免费高潮 | 日本在线影院 | 视频一区 国产精品 | 美女视频黄的免费 | 天堂成人国产精品一区 | 男的操女的视频 | 日韩一区二区三免费高清在线观看 | 欧美成在线观看 | 国产在线国偷精品免费看 | 麻豆传媒一区 | 日皮视频在线观看 | 丰满少妇一级毛片不卡免费 | 国产欧美一区二区精品性色 |