多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

poj 2778 AC自動機與矩陣連乘

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

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; }


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美视频精品 | 大香伊蕉在人线国产75视频 | 视频日韩p影院永久免费 | 亚洲性图视频 | 黄色aa大片 | 最近好中文字幕国语免费高清 | 痴汉电车在线看 | jzz欧美 | 三人交free性 hd | 国产精品久久久久久 | 欧美色视频免费高清播放 | 一区二区三区欧美视频 | 秋霞一级成人欧美理论 | www.日本在线 | 国产成人乱码一区二区三区 | 最近中文字幕资源4 | 国产精品亚洲精品日韩己满十八小 | 日本欧美一区 | 欧美另类 videos黑人极品 | 日韩在线专区 | 亚洲人成在线观看男人自拍 | 国产美女福利视频福利 | 天堂在线看 | 一级做a爰片久久毛片美女 一级做a爰片久久毛片欧美 | japanese在线视频 | 精品国产日韩亚洲一区在线 | 91真人毛片一级在线播放 | 玖玖精品视频 | 手机看片国产免费久久网 | 黄色网址免费观看 | 国产在线一91区免费国产91 | 国产精品第1页在线观看 | 国产亚洲精品久久久久久久网站 | 日韩欧美三区 | 羞羞首页登录界面入口免费 | 亚洲黄色在线观看 | 美女精品永久福利在线 | www.黄色免费 | 精品中文字幕不卡在线视频 | 国内自拍视频在线播放 | 亚洲网站视频 |