• <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
            數據加載中……

            AC自動機 字符串搜索

             

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

             

            view plaincopy to clipboardprint?

            1. /*

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

            3. 此題通過hdu 2222

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

            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;   //該節點是否為某模式串的終結點

            18. int  cnt;    //以該節點為終結點的模式串個數

            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 肥仔 閱讀(431) 評論(0)  編輯 收藏 引用 所屬分類: 狀態機 & 自動機 & 形式語言

            日本欧美久久久久免费播放网| 久久SE精品一区二区| 综合久久国产九一剧情麻豆| 久久久亚洲裙底偷窥综合| 久久亚洲日韩精品一区二区三区| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 色婷婷噜噜久久国产精品12p| 美女写真久久影院| 久久毛片一区二区| 久久综合狠狠综合久久| 国内精品久久久久久久coent| 精品国产日韩久久亚洲| 国产精品美女久久久久久2018| 久久九九久精品国产免费直播| 久久久无码一区二区三区| 久久国产免费直播| 九九99精品久久久久久| 欧美精品一区二区久久| 狠狠色丁香久久婷婷综合五月| 中文字幕无码av激情不卡久久| 久久久久国产一级毛片高清版| 狠狠色婷婷久久综合频道日韩| 久久久久亚洲AV无码专区桃色 | 人妻无码αv中文字幕久久琪琪布| 久久99精品久久久久子伦| 伊人久久成人成综合网222| 国产精品无码久久综合网| 久久香综合精品久久伊人| 久久精品国产欧美日韩99热| 国产亚州精品女人久久久久久| av无码久久久久不卡免费网站| 伊人久久大香线蕉综合Av| 亚洲精品视频久久久| 久久精品国产只有精品66| 久久精品九九亚洲精品天堂| 久久99国内精品自在现线| 少妇高潮惨叫久久久久久| 99久久综合国产精品免费| 国产成人精品久久| 亚洲香蕉网久久综合影视| 亚洲AV无码一区东京热久久|