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

poj 2778 DNA Sequence AC自動(dòng)機(jī)+矩陣快速冥

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

#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;//節(jié)點(diǎn)總個(gè)數(shù)
}

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) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 字符串

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

導(dǎo)航

統(tǒng)計(jì)

公告

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

me

好友

同學(xué)

網(wǎng)友

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲影院免费| 永久久久久久| 久久九九免费| 久久av一区二区三区| 久久久久久久性| 欧美1区2区3区| 欧美日韩视频在线一区二区| 国产精品免费一区二区三区在线观看| 国产精品区二区三区日本| 国产精品日韩欧美| 精品二区视频| 一区二区欧美日韩| 欧美在线观看网站| 欧美 日韩 国产精品免费观看| 亚洲第一综合天堂另类专| 亚洲黄色影院| 亚洲免费视频一区二区| 麻豆成人在线观看| 欧美日韩精品一二三区| 国产亚洲一区二区三区在线播放| 亚洲黄色在线视频| 欧美在线一区二区三区| 欧美岛国在线观看| 亚洲一区二区三区在线看 | 亚洲网站啪啪| 欧美一级久久| 欧美肥婆bbw| 国产欧美婷婷中文| 亚洲伦理一区| 噜噜噜91成人网| 一区二区三区产品免费精品久久75 | 亚洲人午夜精品| 久久gogo国模裸体人体| 欧美日韩综合在线| 亚洲人成在线观看| 久久五月天婷婷| 亚洲一区在线观看免费观看电影高清 | 老司机aⅴ在线精品导航| 亚洲人成在线播放| 久久综合一区| 好吊视频一区二区三区四区| 亚洲在线观看免费视频| 91久久精品国产91性色| 久久免费99精品久久久久久| 国产婷婷一区二区| 亚洲欧美在线免费| 一区二区三区四区国产精品| 欧美精品九九| 亚洲免费av电影| 欧美激情在线狂野欧美精品| 久久精品99国产精品酒店日本| 国产精品一级二级三级| 亚洲免费综合| 亚洲综合激情| 国产欧美日韩精品a在线观看| 亚洲免费综合| 亚洲一区成人| 国产精品亚洲综合久久| 校园春色国产精品| 亚洲欧美日韩国产| 国产一区二区三区在线观看视频 | 国产精品久久久亚洲一区| 亚洲一区国产| 亚洲欧美另类在线观看| 国产精品一区二区久久久| 午夜精品久久久久久久99樱桃 | 国产麻豆视频精品| 欧美黄色一区二区| 亚洲国产欧美国产综合一区| 久久精品国产久精国产爱| 亚洲一区二区三区精品在线观看| 欧美日韩三级电影在线| 亚洲精品日韩激情在线电影| 亚洲国产精品小视频| 久久免费国产| 亚洲高清视频中文字幕| 影音先锋中文字幕一区二区| 久久久精彩视频| 亚洲视频在线观看视频| 一区二区三区高清在线| 91久久国产综合久久| 欧美va天堂| 99热这里只有精品8| 午夜精品福利一区二区蜜股av| 欧美视频一区二区| 午夜精品一区二区三区四区| 麻豆av一区二区三区久久| 国产一区二区三区四区五区美女| 欧美在线观看天堂一区二区三区| 欧美在线视频免费| 永久免费精品影视网站| 欧美精品国产一区| 久久国产精品亚洲77777| 欧美精品一区二区三区蜜臀| 久久精品官网| 亚洲国产日本| 亚洲天堂av综合网| 精品1区2区3区4区| 日韩视频免费大全中文字幕| 国产欧美日韩精品在线| 欧美黄在线观看| 国产精品视频男人的天堂| 欧美大成色www永久网站婷| 欧美性开放视频| 欧美激情视频给我| 国产亚洲电影| 91久久综合| 国产在线观看精品一区二区三区| 亚洲精品日韩久久| 亚洲国产精品久久久久婷婷884 | 麻豆精品精品国产自在97香蕉| 猫咪成人在线观看| 性8sex亚洲区入口| 欧美韩日高清| 老牛影视一区二区三区| 国产精品每日更新| 亚洲精品视频啊美女在线直播| 樱桃成人精品视频在线播放| 在线中文字幕不卡| 99精品视频免费观看| 久久亚洲国产成人| 久久一区激情| 国产日韩欧美不卡在线| 亚洲视频在线观看网站| 宅男在线国产精品| 欧美韩国在线| 亚洲国产欧美一区二区三区久久 | 久久精品二区三区| 国产精品久久久久永久免费观看| 亚洲日本视频| 日韩午夜在线| 欧美精品激情在线| 亚洲区国产区| 夜夜嗨一区二区| 欧美另类视频| 亚洲视频香蕉人妖| 亚洲制服av| 国产精品毛片| 欧美一区二区三区日韩视频| 久久黄色网页| 在线观看日韩av电影| 久久一区二区三区四区五区| 老鸭窝亚洲一区二区三区| 亚洲高清视频一区| 欧美精品1区2区| 夜夜嗨av一区二区三区四区| 性欧美大战久久久久久久久| 国产欧美日本在线| 久久精品一区蜜桃臀影院 | 国产日产欧产精品推荐色| 亚洲欧美亚洲| 免费影视亚洲| 日韩亚洲视频| 国产精品美女久久久久久久 | 亚洲视频一起| 久久久久免费| 亚洲精品中文在线| 国产精品久久久久999| 午夜久久99| 亚洲国产一区二区三区在线播 | 在线亚洲一区| 日韩亚洲视频| 国产精品久久一级| 午夜精品国产| 亚洲国产成人不卡| 亚洲欧美国产不卡| 狠狠色综合色综合网络| 久久综合国产精品| 亚洲三级国产| 欧美专区18| 亚洲精品中文字| 国产日韩欧美一区二区三区在线观看| 久久先锋影音| 午夜国产精品影院在线观看| 欧美成人一区二区在线| 亚洲视频在线一区| 黄色av日韩| 欧美视频免费在线| 久久久久久综合| 亚洲午夜激情| 亚洲高清久久久| 久久久噜噜噜久久久| 正在播放亚洲一区| 亚洲国产精品一区二区www| 国产精品久久久久久久久免费樱桃 | 老司机免费视频久久| 亚洲网站视频福利| 激情一区二区| 国产午夜精品视频| 国产精品久久久久久亚洲调教 | 9久草视频在线视频精品| 久久婷婷蜜乳一本欲蜜臀| 亚洲一品av免费观看| 亚洲精品日本| 亚洲国产精品悠悠久久琪琪| 激情成人综合| 国内精品久久久| 国产亚洲a∨片在线观看| 国产精品第三页| 欧美日韩国产精品一卡|