• POJ


     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 using namespace std;
     5 typedef long long ll;
     6 const char* ss="ATCG";
     7 const int N=100+10,M=4,mod=100000;
     8 int m,n;
     9 char s[N];
    10 struct Mat {
    11     int a[N][N],n;
    12     int* operator[](int x) {return a[x];}
    13     Mat(int x) {memset(a,0,sizeof a),n=x;}
    14     Mat operator+(Mat b) {
    15         Mat c(n);
    16         for(int i=0; i<n; ++i)
    17             for(int j=0; j<n; ++j)c[i][j]=(a[i][j]+b[i][j])%mod;
    18         return c;
    19     }
    20     Mat operator*(Mat b)const {
    21         Mat c(n);
    22         for(int k=0; k<n; ++k)
    23             for(int i=0; i<n; ++i)
    24                 for(int j=0; j<n; ++j)c[i][j]=(c[i][j]+(ll)a[i][k]*b[k][j])%mod;
    25         return c;
    26     }
    27 };
    28 Mat Pow(Mat x,int p) {
    29     Mat ret(x.n);
    30     for(int i=0; i<x.n; ++i)ret[i][i]=1;
    31     for(; p; p>>=1,x=x*x)if(p&1)ret=ret*x;
    32     return ret;
    33 }
    34 struct AC {
    35     int go[N][M],pre[N],end[N],tot;
    36     int idx(char ch) {
    37         if(ch=='A')return 0;
    38         if(ch=='T')return 1;
    39         if(ch=='C')return 2;
    40         if(ch=='G')return 3;
    41         return -1;
    42     }
    43     int newnode() {int u=tot++; pre[u]=end[u]=0,memset(go[u],0,sizeof go[u]); return u;}
    44     void init() {tot=0,newnode();}
    45     void ins(char* s,int n) {
    46         int u=0;
    47         for(int i=0; i<n; u=go[u][idx(s[i])],++i)
    48             if(!go[u][idx(s[i])])go[u][idx(s[i])]=newnode();
    49         end[u]=1;
    50     }
    51     void build() {
    52         queue<int> q;
    53         for(int i=0; i<M; ++i)if(go[0][i])q.push(go[0][i]);
    54         while(q.size()) {
    55             int u=q.front();
    56             q.pop();
    57             end[u]|=end[pre[u]];
    58             for(int i=0; i<M; ++i) {
    59                 if(go[u][i])pre[go[u][i]]=go[pre[u]][i],q.push(go[u][i]);
    60                 else go[u][i]=go[pre[u]][i];
    61             }
    62         }
    63     }
    64     Mat getmat() {
    65         Mat ret(tot);
    66         for(int i=0; i<tot; ++i)
    67             for(int j=0; j<M; ++j)if(!end[go[i][j]])ret[go[i][j]][i]++;
    68         return ret;
    69     }
    70 } ac;
    71 int main() {
    72     ac.init();
    73     scanf("%d%d",&m,&n);
    74     while(m--)scanf("%s",s),ac.ins(s,strlen(s));
    75     ac.build();
    76     Mat x=ac.getmat();
    77     x=Pow(x,n);
    78     int ans=0;
    79     for(int i=0; i<x.n; ++i)ans=(ans+x[i][0])%mod;
    80     printf("%d
    ",ans);
    81     return 0;
    82 }
  • 相关阅读:
    设计模式(15)-命令模式
    设计模式(14)-模板方法模式
    设计模式(13)-代理模式
    设计模式(12)-享元模式
    设计模式(3)-工厂方法模式
    微服务(1)-简单初始化项目
    MCMC:Markov Chain&Monte Carlo(二)MH采样和Gibbs采样,MCMC局限性
    MCMC:Markov Chain& Monte Carlo(一)基本cdf采样,rejection采样,Importance采样
    指数族分布:相关概念理解
    matlab隐马尔可夫相关函数简单例子实现(help文档)
  • 原文地址:https://www.cnblogs.com/asdfsag/p/10841808.html
Copyright © 2020-2023  润新知