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

            久久久久亚洲精品无码网址| 国产福利电影一区二区三区久久老子无码午夜伦不 | 一本久道久久综合狠狠爱| 伊人久久大香线蕉av不变影院| 精品国产VA久久久久久久冰| 伊人热人久久中文字幕| 久久久久久精品无码人妻| 2021少妇久久久久久久久久| 一本色综合久久| 99久久人人爽亚洲精品美女| 99蜜桃臀久久久欧美精品网站 | 久久免费视频网站| 日韩乱码人妻无码中文字幕久久 | 久久精品国产清高在天天线| 久久婷婷五月综合色99啪ak| 久久国产成人精品麻豆| 久久人人爽人人爽人人AV东京热| 伊人久久大香线蕉精品| 国产精品免费福利久久| 久久99热这里只频精品6| 国产精品成人精品久久久| 久久精品国产亚洲av日韩| 思思久久99热只有频精品66| 国产精品嫩草影院久久| 老司机国内精品久久久久| 少妇高潮惨叫久久久久久| 久久精品国产免费观看| 亚洲婷婷国产精品电影人久久| 日韩欧美亚洲综合久久影院d3| 五月丁香综合激情六月久久| 少妇熟女久久综合网色欲| 久久综合一区二区无码| 久久天天躁狠狠躁夜夜av浪潮 | 2021国内久久精品| 亚洲精品国产综合久久一线| 国内精品久久久久久久久电影网 | 亚洲第一永久AV网站久久精品男人的天堂AV | 久久久久人妻精品一区| 久久久久久久久无码精品亚洲日韩| 奇米综合四色77777久久| 亚洲精品无码久久久久去q |