码迷,mamicode.com
首页 > 其他好文 > 详细

[poj2778]DNA Sequence(AC自动机+矩阵快速幂)

时间:2017-09-12 19:08:20      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:快速幂   std   矩阵快速幂   amp   clu   mat   queue   str   enc   

解题关键:卡时限过的,正在找原因中。

  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自动机+矩阵快速幂)

标签:快速幂   std   矩阵快速幂   amp   clu   mat   queue   str   enc   

原文地址:http://www.cnblogs.com/elpsycongroo/p/7511693.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!