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

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>
            久久久www成人免费无遮挡大片| 亚洲激情网站| 久久精品视频网| 性欧美1819sex性高清| 亚洲小少妇裸体bbw| 在线一区二区三区四区五区| 一本色道精品久久一区二区三区 | 免费亚洲视频| 欧美日本一区二区视频在线观看 | 一本久久精品一区二区| 亚洲欧美成人| 欧美jizzhd精品欧美巨大免费| 欧美精品一区二区高清在线观看| 欧美精品在线免费| 国产女人水真多18毛片18精品视频| 国产精品久久综合| 亚洲精品综合在线| 欧美精品一区二区三区很污很色的| 奶水喷射视频一区| 国产拍揄自揄精品视频麻豆| 亚洲精品国产精品久久清纯直播 | 女仆av观看一区| 亚洲午夜激情| 欧美吻胸吃奶大尺度电影| 在线观看欧美日本| 久久艳片www.17c.com| 亚洲免费观看| 欧美精品一级| 亚洲一区视频在线观看视频| 欧美精品久久久久久久免费观看 | 欧美日韩色综合| 亚洲精品色婷婷福利天堂| 欧美成人亚洲| 欧美国产日韩精品免费观看| 亚洲人体大胆视频| 欧美激情视频一区二区三区免费 | 国产亚洲欧美另类中文 | 亚洲欧美国产高清| 亚洲精品偷拍| 国产精品自拍一区| 玖玖玖国产精品| 久久精品日韩欧美| 91久久精品久久国产性色也91| 日韩视频免费大全中文字幕| 性高湖久久久久久久久| 亚洲在线1234| 亚洲电影免费观看高清完整版在线| 久久久夜夜夜| 欧美激情精品久久久久久变态| 亚洲人精品午夜在线观看| 一本色道久久88精品综合| 国产美女在线精品免费观看| 亚洲成人在线网| 欧美另类久久久品| 久久婷婷蜜乳一本欲蜜臀| 欧美日韩www| 欧美成人精品三级在线观看| 国产精品国产三级国产普通话99 | 亚洲人成毛片在线播放| 国产精品一二一区| 亚洲精品日产精品乱码不卡| 国产一区二区在线观看免费| 99精品久久久| 一本到12不卡视频在线dvd| 久久九九精品| 久久久久高清| 国产欧美韩日| 久久国内精品自在自线400部| 亚洲在线国产日韩欧美| 欧美视频在线观看免费| 亚洲精品综合在线| 亚洲在线观看| 国产欧美一区视频| 久久精品成人欧美大片古装| 久久天堂成人| 亚洲与欧洲av电影| 欧美一区二区三区男人的天堂 | 久久综合久久美利坚合众国| 亚洲一区二区在线观看视频| 亚洲人成艺术| 巨乳诱惑日韩免费av| 久久夜色精品国产欧美乱| 国产精品影院在线观看| 亚洲一区欧美| 免费观看在线综合色| 尤物九九久久国产精品的分类| 日韩亚洲欧美在线观看| 亚洲午夜精品在线| 国产精品乱码久久久久久| 日韩写真在线| 久久精品盗摄| 亚洲国产欧美不卡在线观看 | 欧美激情精品久久久久久黑人 | 欧美日韩国产综合久久| 亚洲激情第一区| 一区二区三区四区国产精品| 国产精品乱码一区二区三区 | 亚洲理伦在线| 欧美一区二区三区四区在线| 红桃视频一区| 欧美日韩免费区域视频在线观看| 亚洲欧美日韩精品久久奇米色影视| 久久久精品性| 亚洲欧美日本国产专区一区| 99精品视频一区| 久久视频一区二区| 一区二区三区欧美成人| 国产精品一区二区男女羞羞无遮挡| 欧美一级二级三级蜜桃| 亚洲伦理在线| 亚洲日本无吗高清不卡| 欧美激情视频一区二区三区免费| 性欧美超级视频| 亚洲视频碰碰| 亚洲无线观看| 欧美一级播放| 久久精品国产亚洲一区二区三区| 亚洲少妇诱惑| 午夜精品久久久久影视| 午夜精品久久久久| 亚洲欧美日韩一区二区在线 | 欧美一区二区三区电影在线观看| 亚洲乱码国产乱码精品精天堂| 国产精品家教| 亚洲国产婷婷| 激情综合色综合久久| 亚洲激情网址| 国产麻豆精品theporn| 亚洲国产精品视频一区| 国产人成一区二区三区影院| 久久精品一级爱片| 好吊色欧美一区二区三区视频| 老司机成人在线视频| 免费成人av在线| 亚洲欧美清纯在线制服| 欧美a级片网| 亚洲黄色大片| 六十路精品视频| 欧美高清视频一区二区三区在线观看| 久久综合色一综合色88| 亚洲精品国产系列| 黑人巨大精品欧美黑白配亚洲| 国产综合香蕉五月婷在线| 亚洲国产成人91精品| 中文国产成人精品久久一| 久久久噜噜噜久噜久久| 亚洲欧洲日产国产综合网| 久久夜色精品一区| 亚洲国产精品www| 亚洲精品影院在线观看| 亚洲一二三区精品| 欧美日韩成人激情| 亚洲人成亚洲人成在线观看| 久久精品视频免费观看| 亚洲视频www| 国产精品久久激情| 亚洲视频导航| 99综合视频| 欧美日韩亚洲一区二区三区| 亚洲激情专区| 亚洲欧洲精品一区| 欧美ed2k| 99精品99久久久久久宅男| 亚洲观看高清完整版在线观看| 欧美一区二区三区视频免费| 国产精品美女久久久浪潮软件| 亚洲性图久久| 亚洲欧美区自拍先锋| 国产一二精品视频| 免费影视亚洲| 欧美日韩视频在线第一区| 国产精品99久久99久久久二8| 一本久久a久久精品亚洲| 国产午夜亚洲精品不卡| 欧美成人一区在线| 国产精品老牛| 欧美国产91| 国产精品美女主播| 欧美黑人国产人伦爽爽爽| 欧美高清视频www夜色资源网| 亚洲一二三区在线观看| 欧美在线观看一区| 亚洲视频一区二区免费在线观看| 香蕉久久一区二区不卡无毒影院| 亚洲精品影院| 午夜精品免费在线| 久久久视频精品| 99精品国产在热久久下载| 久久精品九九| 久久精品夜色噜噜亚洲a∨| 欧美午夜精彩| 一区二区三区高清在线观看| 一色屋精品视频免费看| 午夜精品免费视频| 久久成人一区二区| 久久一区国产| 最新精品在线| 欧美精品久久久久久| 一区二区三区你懂的| 亚洲影院在线观看|