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

poj 1625 Censored! AC自動機 + DP + 大數加法

   這個題與poj2778dna sequence解法基本一致。只是這個題的答案沒有取模,
而且文本串不太長。問題是不取模的話就只能輸出實際的答案了,就只能用大數了。
   而且用大數的話,再用矩陣冥可能就會超時之類的。
   這類題還可以用除矩陣冥外的另外一種解法,就是直接dp即可。
   二維狀態,第一維代表文本串長度,第二維代表在AC自動機中的狀態。
   比如dp[i][j]代表長度為i的文本串,轉移到Trie圖中節點j時候滿足不包含任何模式串的答案。
剩下的是如何轉移狀態。轉移的話也是考慮next指針數組,設next = tries[j].next[k],
那么有dp[i+1][next] = dp[i+1][next] + dp[i][j],從0到字母集合大小N枚舉k即可。
   這個題有一個易錯的地方,就是字母集合可能是ascii碼在128到256的范圍內。而char
的范圍可能是-128到127或者0到255,這個是根據編譯器不同的。所以,直接用字符串
數組讀入數據后需要再處理下。可以直接將每個字符加128后再處理。
   另外,getchar返回的是int,但是與gets之類的函數獲得的值的差別也不是那么確定的了。
我覺得getchar除了對eof之外其余都返回正值。但是,如果char是有符號的話,scanf或者
gets之類得到的char數組里面可能就包含負值了。。。
   這個可以生成隨機文件,再用getchar讀入并用%d輸出其返回值驗證下。驗證程序如下:
注釋掉的部分是生成隨機文件的部分。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char ch;
    freopen("in.txt", "r", stdin);
    //freopen("in.txt", "w", stdout);
    int nNum = 100;
    int nCh;
    do
    {
        printf("%d\n", nCh = getchar());
    }while (nCh != EOF);
    /*while (nNum--)
    {
        putchar(rand() % 256);
    }
*/
    
    return 0;
}
   
   該題的代碼如下:
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;

const int MAX_D = 256;
const int MAX_N = 51;
const int MAX_M = 51;
const int MAX_P = 11;
struct Trie
{
    Trie* fail;
    Trie* next[MAX_D];
    int no;
    bool flag;
};
Trie tries[MAX_P * MAX_P];
int nP;
int nN, nM;
Trie* pRoot;
int nHash[MAX_D];
char szPat[MAX_M];

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(Trie* pRoot, char* pszPat)
{
    Trie* pNode = pRoot;
    while (*pszPat)
    {
        int idx = nHash[*pszPat];
        if (pNode->next[idx] == NULL)
        {
            pNode->next[idx] = NewNode();
        }
        pNode = pNode->next[idx];
        ++pszPat;
    }
    pNode->flag = true;
}

void BuildAC(Trie* pRoot)
{
    pRoot->fail = NULL;
    queue<Trie*> qt;
    qt.push(pRoot);
    
    while (!qt.empty())
    {
        Trie* front = qt.front();
        qt.pop();
        
        for (int i = 0; i < nN; ++i)
        {
            if (front->next[i])
            {
                Trie* pNode = front;
                while (pNode && pNode->next[i] == NULL)
                {
                    pNode = pNode->fail;
                }
                front->next[i]->fail = pNode? pNode->next[i] : pRoot;
                front->next[i]->flag |= front->next[i]->fail->flag;
                qt.push(front->next[i]);
            }
            else
            {
                front->next[i] = front->fail->next[i];
            }
        }
    }
}

const int MAX_L = 200;
struct BigInt
{
    int nD[MAX_L];
    BigInt()
    {
        Clear();
    }
    void Clear()
    {
        memset(nD, 0, sizeof(nD));
    }
    
    void Print()
    {
        int i = MAX_L - 1;
        while (!nD[i] && i)--i;
        while (i >= 0)
        {
            putchar(nD[i] + '0');
            --i;
        }
    }
    int operator[](int idx) const
    {
        return nD[idx];
    }
    
    intoperator[](int idx)
    {
        return nD[idx];
    }
};
BigInt bi[MAX_M][MAX_D];

BigInt operator+(const BigInt& one, const BigInt& two)
{
    BigInt ret;
    
    for (int i = 0, nAdd = 0; i < MAX_L; ++i)
    {
        ret[i] = one[i] + two[i] + nAdd;
        nAdd = ret[i] / 10;
        ret[i] %= 10;
    }
    
    return ret;
}

void Solve()
{
    BigInt ans;
    for (int i = 0; i <= nM; ++i)
    {
        for (int j = 0; j < nP; ++j)
        {
            bi[i][j].Clear();
        }
    }
    bi[0][0][0] = 1;
    
    for (int i = 1; i <= nM; ++i)
    {
        for (int j = 0; j < nP; ++j)
        {
            if (tries[j].flag) continue;
            for (int k = 0; k < nN; ++k)
            {
                int nNext = tries[j].next[k] - tries;
                if (tries[nNext].flag == false)
                {
                    bi[i][nNext] = bi[i][nNext] + bi[i - 1][j];
                }
            }
        }
    }
    
    for (int i = 0; i < nP; ++i)
    {
        ans = ans + bi[nM][i];
    }
    ans.Print();
    printf("\n");
}

int main()
{
    int nT;
    
    while (scanf("%d%d%d%*c", &nN, &nM, &nT) == 3)
    {
        int nCh;
        int nTmp = 0;
        memset(nHash, 0, sizeof(nHash));
        while (nCh = getchar(), nCh != '\n')
        {
            if (!nHash[nCh])
            {
                nHash[nCh] = nTmp++;
            }
        }
        InitTrie(pRoot);
        while (nT--)
        {
            gets(szPat);
            Insert(pRoot, szPat);
        }
        printf("1");
        BuildAC(pRoot);
        printf("2");
        Solve();
    }
    
    return 0;
}

posted on 2012-10-20 21:01 yx 閱讀(665) 評論(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>
            另类综合日韩欧美亚洲| 欧美成人有码| 午夜精品福利在线| 99re6这里只有精品视频在线观看| 美女在线一区二区| 亚洲日韩成人| 日韩视频一区二区三区在线播放免费观看 | 狠色狠色综合久久| 久久综合电影| 开心色5月久久精品| 亚洲精品男同| 中文有码久久| 国产欧美日韩不卡| 久久免费一区| 欧美va亚洲va日韩∨a综合色| 国产精品毛片高清在线完整版| 亚洲国产cao| 亚洲日本欧美| 国产精品久久久久久久久久久久久| 欧美怡红院视频| 免费观看在线综合色| 99在线热播精品免费| 亚洲网友自拍| 亚洲国产成人不卡| 亚洲毛片网站| 一区二区三区无毛| 亚洲理论电影网| 国产综合色在线视频区| 91久久香蕉国产日韩欧美9色| 国产免费观看久久黄| 蜜桃av综合| 国产精品久久一区二区三区| 美脚丝袜一区二区三区在线观看| 欧美日韩国产一区二区三区| 久久久国产精品亚洲一区| 欧美好吊妞视频| 久久九九精品| 国产精品xxxav免费视频| 欧美www在线| 国产精品一区二区三区成人| 亚洲第一在线| 国内久久精品| 亚洲在线一区二区三区| 亚洲欧洲日本国产| 久久精品视频在线免费观看| 国产综合色在线| 一区二区三区.www| 亚洲国产欧美一区| 性高湖久久久久久久久| 在线一区二区日韩| 猛干欧美女孩| 蜜臀a∨国产成人精品| 国产精品美女www爽爽爽视频| 91久久午夜| 亚洲欧洲一区二区三区久久| 久久久国产午夜精品| 欧美亚洲免费| 国产精品美女久久久| 99精品热视频| 一区二区三区.www| 欧美福利电影网| 亚洲丰满在线| 亚洲精品久久久一区二区三区| 久久精品亚洲| 久久在线免费| 娇妻被交换粗又大又硬视频欧美| 午夜视频一区在线观看| 欧美一级成年大片在线观看| 国产精品高潮久久| 亚洲一区二区三区四区视频| 一本色道久久综合亚洲精品不卡| 欧美激情精品| 亚洲精品中文字幕在线| 日韩一级成人av| 欧美日韩亚洲视频一区| 亚洲美女免费精品视频在线观看| 一区二区三区回区在观看免费视频| 欧美jizz19性欧美| 亚洲精品黄色| 亚洲欧美激情视频| 国产精品夜色7777狼人| 欧美成人在线影院| 91久久久久久| 欧美日韩国产系列| 亚洲一区二区免费| 欧美影院在线播放| 国产一区二区三区在线观看免费视频| 欧美一区免费| 欧美a级片网站| 99精品欧美一区二区三区| 欧美乱大交xxxxx| 亚洲自拍偷拍福利| 久久综合九色综合欧美狠狠| 亚洲乱码国产乱码精品精天堂 | 午夜日本精品| 麻豆精品一区二区av白丝在线| 亚洲精品极品| 国产精品亚洲综合久久| 久久精品国产免费| 亚洲精品九九| 久久久成人网| 亚洲视频在线观看视频| 国产欧美日韩免费看aⅴ视频| 久久久久女教师免费一区| 亚洲韩国青草视频| 欧美亚洲综合另类| 在线日韩av片| 国产精品嫩草久久久久| 久久久噜噜噜久久中文字幕色伊伊| 亚洲精品一二三| 美女视频一区免费观看| 亚洲专区国产精品| 在线精品视频一区二区| 欧美特黄视频| 每日更新成人在线视频| 亚洲一级黄色av| 亚洲国产成人久久| 久久天堂成人| 欧美一区二区三区在线看| 亚洲精品乱码| 极品中文字幕一区| 国产美女诱惑一区二区| 欧美日韩天天操| 免费观看一区| 久久男女视频| 久久国产日韩欧美| 亚洲免费在线视频| 夜夜嗨av色综合久久久综合网| 欧美a级片网站| 久久久国产亚洲精品| 亚洲欧美日韩国产综合在线 | 国产精品另类一区| 欧美成人在线免费视频| 久久福利影视| 小黄鸭精品aⅴ导航网站入口| 一区二区三区四区国产| 亚洲国产精品一区二区三区| 免费看成人av| 蜜臀va亚洲va欧美va天堂| 久久成人精品视频| 亚洲综合不卡| 亚洲欧美国产毛片在线| 亚洲视频欧洲视频| 亚洲午夜激情免费视频| 日韩一级片网址| 亚洲伦伦在线| 亚洲美女av黄| 亚洲免费电影在线观看| 日韩图片一区| 夜夜嗨av一区二区三区四区| 亚洲精品美女91| 一区二区毛片| 亚洲欧美日韩天堂一区二区| 亚洲尤物精选| 欧美中文字幕在线视频| 久久精品国亚洲| 蜜臀av一级做a爰片久久| 美女黄网久久| 亚洲欧洲一区二区天堂久久| 亚洲欧洲三级电影| 日韩一二三在线视频播| 中日韩在线视频| 亚洲欧美视频一区| 久久精品中文字幕一区二区三区 | 亚洲免费在线看| 欧美在线观看视频| 老司机午夜精品视频在线观看| 欧美丰满少妇xxxbbb| 欧美三级免费| 国内精品99| 日韩视频在线一区| 亚洲欧美中文在线视频| 久久久99爱| 亚洲国产经典视频| 亚洲日本欧美天堂| 午夜欧美精品| 欧美精品久久久久久久免费观看 | 亚洲小视频在线| 久久久久久九九九九| 亚洲国产乱码最新视频| 亚洲网站在线观看| 久久久久久噜噜噜久久久精品| 欧美激情亚洲国产| 国产欧美69| 日韩视频精品在线观看| 欧美一区二区视频在线| 欧美国产欧美综合| 在线一区二区三区四区五区| 久久久噜噜噜久久久| 国产精品久久久久久久9999| 在线播放国产一区中文字幕剧情欧美 | 欧美粗暴jizz性欧美20| 国产精品国产三级国产普通话99 | 欧美亚洲在线观看| 亚洲电影免费在线观看| 欧美亚洲系列| 国产精品xnxxcom| 99国产精品久久| 欧美大片一区二区三区| 亚洲一二三级电影|