栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 2778 DNA Sequence

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 2778 DNA Sequence

#include<cstdio>#include<cstring>#include<queue>using namespace std;const int mod = 100000;const int N = 20;const int M = 110;char s[N];typedef long long LL;int sz;struct Matrix{    LL x[M][M];};Matrix operator * (Matrix A, Matrix B){        Matrix C;        for(int i=0; i<sz; i++){ for(int j=0; j<sz; j++){     LL &t = C.x[i][j];     t = 0;     for(int k=0; k<sz; k++){         if(A.x[i][k] && B.x[k][j]){  t += A.x[i][k] * B.x[k][j];         }     }     t %= mod; }        }        return C;    }Matrix pow(Matrix A, int p){    Matrix S;    for(int i=0; i<sz; i++){        for(int j=0; j<sz; j++) S.x[i][j] = i==j?1:0;    }    while(p){        if(p&1) S = S*A;        A = A*A;        p>>=1;    }    return S;}struct ACAuto{    int ch[M][4], f[M];    bool mk[M];    void init(){        memset(ch[0], 0, sizeof(ch[0]));        sz = 1;        f[0] = mk[0] = 0;    }    int idx(char c){        switch(c){ case 'A':return 0; case 'G':return 1; case 'C':return 2; default: return 3;        }    }    void insert(){        int len = strlen(s);        int u = 0;        for(int i=0; i<len; i++){ int c = idx(s[i]); if(!ch[u][c]){     memset(ch[sz],0,sizeof(ch[sz]));     mk[sz] = 0;     ch[u][c] = sz++; } u = ch[u][c];        }        mk[u] = 1;    }    void getFail(){        queue<int> Q;        for(int i=0; i<4; i++){ int u = ch[0][i]; if(u){     Q.push(u);     f[u] = 0; }        }        while(!Q.empty()){ int r=Q.front(); Q.pop(); for(int c=0; c<4; c++){     int u = ch[r][c];     if(!u){         ch[r][c] = ch[f[r]][c];         continue;     }     Q.push(u);     int v = f[r];     while(v && !ch[v][c])   v = f[v];     f[u] = ch[v][c];     mk[u] |= mk[f[u]]; }        }    }    Matrix getMatrix(){        Matrix A;        memset(A.x, 0, sizeof(A.x));        for(int i=0; i<sz; i++){ for(int j=0; j<4; j++){     int u = ch[i][j];     if(!mk[u])  A.x[i][u]++; }        }        return A;    }}ac;int main(){    int n, m;    while(~scanf("%d %d", &n, &m)){        ac.init();        while(n--){ scanf("%s", s); ac.insert();        }        ac.getFail();        Matrix A = ac.getMatrix();        A = pow(A, m);        int ans = 0;        for(int i=0; i<sz; i++){ ans += A.x[0][i]; if(ans>=mod)    ans-=mod;        }        printf("%dn", ans);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380576.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号