青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

poj 2778 DNA Sequence AC自動機+矩陣快速冥

   題意很簡單,假定文本集就是A,C,T,G,給定M個模式串,問你長度為N的文本不出現這些模式
串的可能性到底有多少種。。。
   確實非常不直觀的樣子。。。
   解法是先學學AC自動機,建立起Trie圖,根據trie圖可以得到長度為1的路徑矩陣,然后再快速
冥得到長度為N的路徑矩陣。
   說起來都非常糾結,沒學過AC自動機更加無法理解。學AC自動機之前據說得先學Trie樹和KMP
才好理解。學AC自動機搞Trie圖就花費了近2天了,然后弄懂這個題又是一天,好在基本明白了。
   馬上快比賽了,從長春換到金華也不知道是好是壞。。。還是弱菜啊。。。
   貼下我的Trie圖+快速冥(直接二分了,沒有寫成數論里面那種算法)...

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;

typedef long long INT;
const int MOD = 100000;
const int MAX_P = 100;
const int MAX_D = 4;
int nIdx[256];
char szPat[MAX_P];
INT nMatrix[MAX_P][MAX_P];
INT B[MAX_P][MAX_P];
INT A[MAX_P][MAX_P];

void InitIdx()
{
    nIdx['A'] = 0;
    nIdx['C'] = 1;
    nIdx['T'] = 2;
    nIdx['G'] = 3;
}

struct Trie
{
    Trie* fail;
    Trie* next[MAX_D];
    int no;
    bool flag;
    Trie()
    {
        fail = NULL;
        memset(next, 0, sizeof(next));
        no = 0;
        flag = false;
    }
};
Trie tries[MAX_D * MAX_P];
int nP;
Trie* pRoot;

Trie* NewNode()
{
    memset(&tries[nP], 0, sizeof(Trie));
    tries[nP].no = nP;
    return &tries[nP++];
}

void InitTrie(Trie*& pRoot)
{
    nP = 0;
    pRoot = NewNode();
}

void Insert(char* pszPat)
{
    Trie* pNode = pRoot;
    
    while (*pszPat)
    {
        if (pNode->next[nIdx[*pszPat]] == NULL)
        {
            pNode->next[nIdx[*pszPat]] = NewNode();
        }
        pNode = pNode->next[nIdx[*pszPat]];
        ++pszPat;
    }
    pNode->flag = true;
}

int BuildAC(Trie* pRoot)
{
    memset(nMatrix, 0, sizeof(nMatrix));
    
    pRoot->fail = NULL;
    queue<Trie*> qt;
    qt.push(pRoot);
    while (!qt.empty())
    {
        Trie* front = qt.front();
        qt.pop();
        
        for (int i = 0; i < MAX_D; ++i)
        {
            if (front->next[i])
            {
                Trie* pNode = front->fail;
                while (pNode && pNode->next[i] == NULL)
                {
                    pNode = pNode->fail;
                }
                front->next[i]->fail = pNode? pNode->next[i] : pRoot;
                if (front->next[i]->fail->flag == true)
                {
                    front->next[i]->flag = true;
                }
                
                qt.push(front->next[i]);
            }
            else
            {
                front->next[i] = front == pRoot? pRoot : front->fail->next[i];
            }
            
            if (front->next[i]->flag == false)
            {
                nMatrix[front->no][front->next[i]->no]++;
            }
        }
    }
    
    return nP;//節點總個數
}

void MultyMatrix(INT A[][MAX_P], INT B[][MAX_P], INT C[][MAX_P], int nSize)
{
    for (int i = 0; i < nSize; ++i)
    {
        for (int j = 0; j < nSize; ++j)
        {
            INT nSum = 0;
            for (int k = 0; k < nSize; ++k)
            {
                nSum = (nSum + A[i][k] * B[k][j]) % MOD;
            }
            C[i][j] = nSum;
        }
    }
}

void CopyMatrix(INT A[][MAX_P], INT B[][MAX_P], int nSize)
{
    for (int i = 0; i < nSize; ++i)
    {
        for (int j = 0; j < nSize; ++j)
        {
            A[i][j] = B[i][j];
        }
    }
}

void MatrixPower(INT M[][MAX_P], int nSize, INT nP)
{
    if (nP == 1)
    {
        CopyMatrix(A, M, nSize);
        return;
    }
    
    MatrixPower(M, nSize, nP / 2);
    MultyMatrix(A, A, B, nSize);
    if (nP % 2)
    {
        MultyMatrix(B, M, A, nSize);
    }
    else
    {
        CopyMatrix(A, B, nSize);
    }
}

int main()
{
    INT nM, nN;
    
    InitIdx();
    while (scanf("%I64d%I64d", &nM, &nN) == 2)
    {
        InitTrie(pRoot);
        while (nM--)
        {
            scanf("%s", szPat);
            Insert(szPat);
        }
        int nSize = BuildAC(pRoot);
        
        MatrixPower(nMatrix, nSize, nN);
        INT nAns = 0;
        for (int i = 0; i < nSize; ++i)
        {
            nAns = (nAns + A[0][i]) % MOD;
        }
        printf("%I64d\n", nAns % MOD);
    }
    
    return 0;
}
   
   

posted on 2012-10-18 09:46 yx 閱讀(1233) 評論(0)  編輯 收藏 引用 所屬分類: 字符串

<2012年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導航

統計

公告

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

me

好友

同學

網友

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久久久午夜| 久久精品五月婷婷| 久久久久久久久久久久久9999| 亚洲在线网站| 欧美在线视频不卡| 久久久美女艺术照精彩视频福利播放 | 在线色欧美三级视频| 一区二区视频欧美| 最新国产乱人伦偷精品免费网站| 99精品国产福利在线观看免费| 在线亚洲电影| 久久久www成人免费毛片麻豆| 久久综合色天天久久综合图片| 你懂的亚洲视频| 9人人澡人人爽人人精品| 午夜亚洲性色视频| 欧美高清视频一区二区三区在线观看 | 久久精品国产精品亚洲| 欧美成人免费观看| 一区二区三区三区在线| 久久一区二区三区av| 欧美日韩一卡| 在线日韩一区二区| 欧美亚洲综合另类| 欧美激情中文字幕在线| 一个人看的www久久| 久久精品亚洲| 国产精品成人在线观看| 1000精品久久久久久久久 | 麻豆国产va免费精品高清在线| 女主播福利一区| 亚洲女人小视频在线观看| 麻豆精品国产91久久久久久| 欧美日韩高清区| 悠悠资源网亚洲青| 亚洲男人的天堂在线观看| 亚洲电影一级黄| 欧美一区影院| 欧美日韩一区在线观看视频| 亚洲第一黄网| 久久av资源网站| 一区二区三区精品| 欧美成人综合在线| 一区二区在线视频| 久久久7777| 欧美一区二视频| 亚洲色图综合久久| 亚洲高清一区二区三区| 性做久久久久久| 国产精品欧美久久久久无广告| 久久精品亚洲| 亚洲综合色自拍一区| 欧美国产精品| 久久久久99精品国产片| 国产精品视频专区| 亚洲在线视频一区| 一区二区三区高清| 欧美视频中文字幕在线| 亚洲一区二区毛片| 日韩一区二区精品葵司在线| 欧美国产激情二区三区| 在线观看不卡| 久久综合五月| 久久综合狠狠综合久久综青草| 国产亚洲aⅴaaaaaa毛片| 欧美一区二区三区日韩视频| 亚洲一区二区三区视频播放| 国产精品久久久久久久电影 | 亚洲日本成人在线观看| 欧美国产另类| 欧美xx69| 一区二区免费看| 一本到高清视频免费精品| 欧美午夜视频在线| 欧美一区二区免费观在线| 亚洲男人的天堂在线aⅴ视频| 国产欧美在线看| 久久精品伊人| 老色鬼久久亚洲一区二区| 亚洲国产综合视频在线观看| 亚洲电影免费观看高清完整版在线观看 | 在线成人激情视频| 欧美成人一区二区| 欧美激情视频在线播放| 一区二区三区高清不卡| 亚洲婷婷综合久久一本伊一区| 国产精品亚洲欧美| 蜜桃久久精品一区二区| 欧美精品在线一区| 欧美一区二区女人| 久久中文字幕一区| 一本久道综合久久精品| 亚洲先锋成人| 在线观看一区| 在线亚洲一区| 又紧又大又爽精品一区二区| 亚洲精品五月天| 国产一区二区三区成人欧美日韩在线观看 | 国内精品国产成人| 欧美激情一区二区| 国产精品乱码久久久久久| 久久偷窥视频| 欧美日韩日日骚| 久久精品色图| 欧美日韩成人综合天天影院| 欧美一区成人| 欧美精品一区二| 久久漫画官网| 欧美日韩视频| 欧美福利视频网站| 国产精品一级| 亚洲激情成人在线| 国产综合色产| 亚洲尤物精选| aa级大片欧美三级| 久久久久久有精品国产| 午夜视频精品| 欧美日韩国产色视频| 国产亚洲欧美一区二区| 亚洲欧洲在线视频| 狠狠色丁香婷婷综合| 一个色综合av| 99热精品在线| 欧美jizz19hd性欧美| 久久免费国产精品| 国产精品专区一| 久久国产日韩| 国产精品久久久久久户外露出| 91久久精品国产91久久性色| 精品成人一区二区三区四区| 亚洲欧美在线视频观看| 亚洲综合丁香| 国产精品久久久久久五月尺| 日韩一级黄色大片| 一本一道久久综合狠狠老精东影业| 久久天天综合| 欧美成人高清视频| 在线播放豆国产99亚洲| 久久露脸国产精品| 久久久视频精品| 韩国在线视频一区| 久久久999国产| 老司机一区二区三区| 激情av一区二区| 久久男女视频| 欧美黄色视屏| 亚洲精品在线免费| 欧美激情在线免费观看| 亚洲日本欧美日韩高观看| 日韩视频免费| 国产精品jizz在线观看美国| 日韩亚洲精品在线| 性欧美1819性猛交| 狠狠色狠狠色综合系列| 免费久久99精品国产| 亚洲三级电影在线观看| 亚洲一区二区三区在线播放| 欧美午夜精品一区二区三区| 亚洲欧美日韩一区在线| 老司机aⅴ在线精品导航| 欧美一区激情| 国产精品久久久久久一区二区三区| 99精品热6080yy久久| 午夜精品福利一区二区三区av| 国产精品一二| 久久免费一区| 一本一道久久综合狠狠老精东影业 | 亚洲伦伦在线| 久久精品五月| 亚洲精品在线一区二区| 欧美亚洲成人精品| 久久久人成影片一区二区三区 | 久久精品国产一区二区三区免费看| 欧美成人免费小视频| 中文一区二区| 在线观看国产日韩| 国产精品成人免费精品自在线观看 | 久久这里有精品15一区二区三区| 亚洲精品女av网站| 国产区精品在线观看| 女人色偷偷aa久久天堂| 亚洲一区二区三区涩| 欧美国产高潮xxxx1819| 先锋亚洲精品| 91久久夜色精品国产网站| 国产精品入口麻豆原神| 欧美xx视频| 久久精品国产99国产精品澳门 | 噜噜噜噜噜久久久久久91| 夜夜嗨av一区二区三区四季av| 久久综合电影| 欧美亚洲一区二区在线| 夜夜嗨av一区二区三区| 亚洲第一黄色| 国产一区二区黄| 国产精品久久久久久久久久直播| 麻豆精品一区二区av白丝在线| 亚洲午夜精品一区二区三区他趣 | 亚洲欧美日韩国产综合| 亚洲精品国产精品乱码不99按摩|