1. 程式人生 > >[poj2778]DNA Sequence(AC自動機+矩陣快速冪)

[poj2778]DNA Sequence(AC自動機+矩陣快速冪)

build printf class queue cstring node mod names sequence

解題關鍵:卡時限過的,正在找原因中。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cstdlib>
  5 #include<cstring>
  6 #include<iostream>
  7 #include<queue>
  8 using namespace std;
  9 typedef long long ll;
 10 const int N=4;
 11
const int MAXN=101; 12 struct mat{ 13 ll m[101][101]; 14 }; 15 ll m,n; 16 ll mod=100000; 17 struct Trie{ 18 int Next[MAXN][N],Fail[MAXN],root,tot; 19 bool End[MAXN]; 20 int newnode(){ 21 for(int i=0;i<N;i++) Next[tot][i]=-1; 22 End[tot++]=false; 23 return
tot-1; 24 } 25 void init(){ 26 tot=0; 27 root=newnode(); 28 } 29 void insert(char buf[]){ 30 int len=strlen(buf),now=root,k; 31 for(int i=0;i<len;i++){ 32 if(buf[i]==A) k=0; 33 else if(buf[i]==G) k=1; 34
else if(buf[i]==C) k=2; 35 else k=3; 36 if(Next[now][k]==-1) Next[now][k]=newnode(); 37 now=Next[now][k]; 38 } 39 End[now]=true; 40 } 41 void build(){ 42 queue<int>que; 43 Fail[root]=root; 44 for(int i=0;i<N;i++){ 45 if(Next[root][i]==-1) Next[root][i]=root; 46 else{ 47 Fail[Next[root][i]]=root; 48 que.push(Next[root][i]); 49 } 50 } 51 while(!que.empty()){ 52 int now=que.front(); 53 que.pop(); 54 if(End[Fail[now]]) End[now]=true; 55 for(int i=0;i<N;i++){ 56 if(Next[now][i]==-1) Next[now][i]=Next[Fail[now]][i]; 57 else{ 58 Fail[Next[now][i]]=Next[Fail[now]][i]; 59 que.push(Next[now][i]); 60 } 61 } 62 } 63 } 64 mat get_mat(int len){ 65 mat B={0}; 66 for(int i=0;i<len;i++){ 67 for(int j=0;j<N;j++){ 68 if(End[Next[i][j]]==false) B.m[i][Next[i][j]]++;//不能直接置1 69 } 70 } 71 return B; 72 } 73 }; 74 75 mat mul(mat &A,mat &B,int len){ 76 mat C={0}; 77 for(int i=0;i<len;i++){ 78 for(int k=0;k<len;k++){ 79 for(int j=0;j<len;j++){ 80 C.m[i][j]=(C.m[i][j]+A.m[i][k]*B.m[k][j]%mod)%mod; 81 } 82 } 83 } 84 return C; 85 } 86 87 mat pow(mat A,ll n,int len){ 88 mat B={0}; 89 for(int i=0;i<len;i++) B.m[i][i]=1; 90 while(n){ 91 if(n&1) B=mul(B,A,len); 92 A=mul(A,A,len); 93 n>>=1; 94 } 95 return B; 96 } 97 98 Trie ac; 99 char buf[10]; 100 int main(){ 101 while(scanf("%lld%lld",&m,&n)!=EOF){ 102 ac.init(); 103 for(int i=0;i<m;i++){ 104 scanf("%s",buf); 105 ac.insert(buf); 106 } 107 ac.build(); 108 mat B=ac.get_mat(ac.tot); 109 B=pow(B,n,ac.tot); 110 ll res=0; 111 for(int i=0;i<ac.tot;i++){ 112 res=(res+B.m[0][i])%mod; 113 } 114 printf("%lld\n",res); 115 } 116 return 0; 117 }

[poj2778]DNA Sequence(AC自動機+矩陣快速冪)