#include#include#include#include#include#include#include#include#include#include#defineLLlongl" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

poj 2778 DNA Sequence

系統 1915 0

http://poj.org/problem?id=2778

AC自動機 + 矩陣連乘

代碼:

      #include<iostream>

#include<cmath>

#include<cstdio>

#include<string>

#include<cstring>

#include<vector>

#include<stack>

#include<queue>

#include<set>

#include<map>

#include<algorithm>



#define LL long long



using namespace std;



const int INF=0x3f3f3f3f;

const int MOD=100000;

const LL LMOD=100000;

const int N=1005;

const int M=1005;

const int K=4;

const int MATRIXN=5;

const int MATRIXM=115;

const int MATRIXH=115;

struct nodeTrie

{

    int v;

    int fail;

    int next[K];

    void initialize()

    {

        v=0;

        fail=-1;

        memset(next,-1,sizeof(next));

    }

}trie[M];

int cnt,root;

char s[N];

LL ma[MATRIXN][MATRIXM],mb[MATRIXM][MATRIXH],mc[MATRIXM][MATRIXH];

int getNewNode()

{

    ++cnt;

    trie[cnt].initialize();

    return cnt;

}

void addWord(int p,char *s,int k)

{

    if(s[0]=='\0') return ;

    for(int i=0;s[i]!='\0';++i)

    {

        if(trie[p].next[s[i]-'A']==-1)

        trie[p].next[s[i]-'A']=getNewNode();

        p=trie[p].next[s[i]-'A'];

    }

    (trie[p].v)=k;

}

void init(int n)

{

    cnt=0;

    root=getNewNode();

    for(int i=0;i<4;++i)

    {

        s[0]='A'+i;s[1]='\0';

        addWord(root,s,0);

    }

    while(n--)

    {

        gets(s);

        for(int i=0;s[i]!='\0';++i)

        {

            if(s[i]=='C')

            s[i]='B';

            else if(s[i]=='G')

            s[i]='C';

            else if(s[i]=='T')

            s[i]='D';

        }

        addWord(root,s,1);

    }

}

void bfs(int p)

{

    trie[p].fail=root;

    queue<int>qt;

    qt.push(p);

    while(!qt.empty())

    {

        int y;

        int x=qt.front();qt.pop();

        for(int i=0;i<K;++i)

        if(trie[x].next[i]!=-1)

        {

            qt.push(trie[x].next[i]);

            if(x==root)

            {trie[trie[x].next[i]].fail=root;continue;}

            y=trie[x].fail;

            while(y!=root&&trie[y].next[i]==-1)

            y=trie[y].fail;

            if(trie[y].next[i]!=-1)

            trie[trie[x].next[i]].fail=trie[y].next[i];

            else

            trie[trie[x].next[i]].fail=root;

        }

    }

}

void makeMatrix(LL a[][MATRIXM],int n)

{

    for(int i=1;i<=n;++i)

    for(int j=1;j<=n;++j)

    a[i][j]=0;

    for(int i=1;i<=n;++i)

    for(int j=0;j<4;++j)

    {//cout<<i<<endl;

        int p=i;

        int q=0;

        while(p!=root&&trie[p].next[j]==-1)

        p=trie[p].fail;

        if(trie[p].next[j]!=-1)

        q=trie[p].next[j];

        int w=q;

        bool flag=true;

        while(w!=root)

        {

            if(trie[w].v>0)

            {flag=false;break;}

            w=trie[w].fail;

        }

        if(trie[w].v>0)

        flag=false;

        if(flag==true)

        a[i][q]=1;

    }

}

void matrixMul(LL a[][MATRIXM],LL b[][MATRIXM],int n,int m,int h)

{

    for(int i=1;i<=n;++i)

    for(int j=1;j<=h;++j)

    {

        LL tmp=0;

        for(int l=1;l<=m;++l)

        tmp=(tmp+a[i][l]*b[l][j])%LMOD;

        mc[i][j]=tmp;

    }

    for(int i=1;i<=n;++i)

    for(int j=1;j<=h;++j)

    a[i][j]=mc[i][j];

}

int main()

{

    //freopen("data.in","r",stdin);

    int n,m;

    while(scanf("%d %d ",&n,&m)!=EOF)

    {

        init(n);

        bfs(root);

        int MN=1,MM=cnt,MH=cnt;

        makeMatrix(mb,MM);

        memset(ma,0,sizeof(ma));

        ma[1][1]=1;

        while(m>0)

        {

            if((m&1)==1)

            matrixMul(ma,mb,MN,MM,MH);

            matrixMul(mb,mb,MM,MM,MH);

            m=(m>>1);

        }

        LL ans=0;

        for(int i=1;i<=MN;++i)

        for(int j=1;j<=MM;++j)

        ans=(ans+ma[i][j])%LMOD;

        cout<<ans<<endl;

    }

    return 0;

}


    

poj 2778 DNA Sequence


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 黑人和黑人激情一级毛片 | 亚洲欧美日韩国产专区一区 | 久久久久久尹人网香蕉 | 美女视频很黄很黄又免费的 | 一级片aa | 国产成人高清精品免费观看 | 日日a.v拍夜夜添久久免费 | julia中文字幕在线 | 欧美精品影视 | 成人夜色视频网站在线观看 | 欧美国产一区二区 | 91福利在线看 | 中文字幕一区二区日产乱码 | 噜噜色综合 | 国产亚洲精品第一区在线观看 | 久热国产精品视频 | 国内精品久久久久久久999下 | 色天使色婷婷在线影院亚洲 | 欧美激情在线播放一区二区 | 日日摸夜夜添夜夜添人人爽 | 久久在线资源 | 97精品久久天干天天蜜 | 妇女毛片 | 日本一区二区三区四区在线观看 | 中文字幕一区二区三区亚洲精品 | 一区二区三区在线 | 99热这里只有精品国产在热久久 | 亚洲国产综合专区在线播一一 | 亚洲一区视频在线播放 | 中文字幕日韩欧美一区二区三区 | 99尹人香蕉国产免费天天在线 | 午夜国产福利在线观看 | 成人人免费夜夜视频观看 | 九九精品视频在线观看九九 | 四虎成人永久影院 | 日韩欧美中文字幕一区二区三区 | 久久久久视频精品网 | 91精品久久久 | 亚洲精品欧美精品中文字幕 | 在线欧美69v免费观看视频 | 久久99热这里只有精品国产 |