• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            AC自動機 字符串搜索

             

            http://blog.csdn.net/soberman/archive/2009/03/10/3978071.aspx

             

            view plaincopy to clipboardprint?

            1. /*

            2. 程序說明:多模式串匹配的AC自動機算法

            3. 此題通過hdu 2222

            4. 自動機算法可以參考《柔性字符串匹配》里的相應章節(jié),講的很清楚

            5. */

            6. #include <stdio.h>

            7. #include <string.h>

            8.

            9.

            10. const int MAXQ = 500000+10;   

            11. const int MAXN = 1000000+10;   

            12. const int MAXK = 26;  //自動機里字符集的大小

            13. struct  TrieNode   

            14. {   

            15.     TrieNode* fail;   

            16.     TrieNode* next[MAXK];   

            17. bool danger;   //該節(jié)點是否為某模式串的終結點

            18. int  cnt;    //以該節(jié)點為終結點的模式串個數(shù)

            19.     TrieNode()   

            20.     {   

            21.         fail = NULL;   

            22.         memset(next, NULL, sizeof(next));   

            23.         danger = false;   

            24.         cnt = 0;   

            25.     }   

            26. }*que[MAXQ], *root;   

            27. //文本字符串

            28. char  msg[MAXN];   

            29. int   N;   

            30. void  TrieInsert(char *s)   

            31. {   

            32. int  i = 0;   

            33.     TrieNode *ptr = root;   

            34. while(s[i])   

            35.     {   

            36. int  idx = s[i]-'a';   

            37. if(ptr->next[idx] == NULL)   

            38.             ptr->next[idx] = new TrieNode();   

            39.         ptr = ptr->next[idx];   

            40.         i++;   

            41.     }   

            42.     ptr->danger = true;   

            43.     ptr->cnt++;   

            44. }   

            45.

            46. void  Init()   

            47. {   

            48. int  i;   

            49. char  s[100];   

            50.     root = new TrieNode();   

            51.     scanf("%d", &N);   

            52. for(i = 0; i < N; i++)   

            53.     {   

            54.         scanf("%s", s);   

            55.         TrieInsert(s);   

            56.     }   

            57. }   

            58.

            59. void  Build_AC_Automation()   

            60. {   

            61. int  rear = 1, front = 0, i;   

            62.     que[0] = root;   

            63.     root->fail = NULL;   

            64. while(rear != front)   

            65.     {   

            66.         TrieNode *cur = que[front++];   

            67. for(i = 0; i < 26; i++)   

            68. if(cur->next[i] != NULL)   

            69.             {   

            70. if(cur == root)   

            71.                     cur->next[i]->fail = root;   

            72. else

            73.                 {   

            74.                     TrieNode *ptr = cur->fail;   

            75. while(ptr != NULL)   

            76.                     {   

            77. if(ptr->next[i] != NULL)   

            78.                         {   

            79.                             cur->next[i]->fail = ptr->next[i];   

            80. if(ptr->next[i]->danger == true)   

            81.                                 cur->next[i]->danger = true;   

            82. break;   

            83.                         }   

            84.                         ptr = ptr->fail;   

            85.                     }   

            86. if(ptr == NULL) cur->next[i]->fail = root;   

            87.                 }   

            88.                 que[rear++] = cur->next[i];   

            89.             }   

            90.     }   

            91. }   

            92.

            93. int  AC_Search()   

            94. {   

            95. int  i = 0, ans = 0;   

            96.     TrieNode *ptr = root;   

            97. while(msg[i])   

            98.     {   

            99. int  idx = msg[i]-'a';   

            100. while(ptr->next[idx] == NULL && ptr != root) ptr = ptr->fail;   

            101.         ptr = ptr->next[idx];   

            102. if(ptr == NULL) ptr = root;   

            103.         TrieNode *tmp = ptr;   

            104. while(tmp != NULL && tmp->cnt != -1)   

            105.         {   

            106.             ans += tmp->cnt;   

            107.             tmp->cnt = -1;   

            108.             tmp = tmp->fail;   

            109.         }   

            110.         i++;   

            111.     }   

            112. return  ans;   

            113. }   

            114.

            115. int  main()   

            116. {   

            117. int  T;   

            118.     scanf("%d", &T);   

            119. while(T--)   

            120.     {   

            121.         Init();   

            122.         Build_AC_Automation();   

            123. //文本

            124.         scanf("%s", msg);   

            125.         printf("%d\n", AC_Search());   

            126.     }   

            127. return 0;   

            128. } 

            posted on 2009-09-25 20:52 肥仔 閱讀(432) 評論(0)  編輯 收藏 引用 所屬分類: 狀態(tài)機 & 自動機 & 形式語言

            精品免费久久久久国产一区| 久久精品国产清自在天天线| A狠狠久久蜜臀婷色中文网| 亚洲?V乱码久久精品蜜桃| 午夜福利91久久福利| 久久精品国产一区二区| 久久免费香蕉视频| 一本久久a久久精品综合香蕉| 久久综合亚洲色HEZYO社区| 狠狠色婷婷久久一区二区 | 九九久久精品无码专区| 99久久精品免费看国产免费| 人妻少妇精品久久| 一本色道久久综合狠狠躁篇| 天天综合久久一二三区| 国产精品成人久久久| 国产免费久久精品99re丫y| 久久精品国产黑森林| 亚洲欧美另类日本久久国产真实乱对白| 国内精品久久久久影院优| 久久久久久一区国产精品| 国产精品成人无码久久久久久 | 亚洲精品乱码久久久久久自慰 | 国产精品美女久久福利网站| 国产精品99久久免费观看| 欧美午夜A∨大片久久| 久久se精品一区二区| 久久婷婷五月综合国产尤物app| 久久免费视频观看| 99久久99这里只有免费费精品| 色偷偷91久久综合噜噜噜噜| 国产呻吟久久久久久久92| 亚洲国产精品人久久| 久久精品青青草原伊人| 国产午夜精品久久久久九九电影| 久久中文字幕精品| 久久精品成人欧美大片| 91精品国产色综久久 | 日本强好片久久久久久AAA| 2021最新久久久视精品爱| 久久久久久久久久久免费精品|