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

            bon

              C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              46 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            重新看了KMP算法,有了新的理解。主要參考資料/Files/bon/kmp2.pdf

            附件里說得很好,跟傳統(tǒng)的教程不同。
            首先定義串s的前綴s',空串也是s的前綴,還有一個(gè)定義叫做proper prefix:s'是s的proper prefix等價(jià)于s'是s的prefix且s' != s,這個(gè)定義對于理解KMP有著關(guān)鍵的作用。同樣可以定義對應(yīng)的后綴以及proper suffix。

            下面假設(shè)模式串為s,被匹配的串為t,且第0個(gè)字符是串的第一個(gè)字符。

            KMP的精髓在于計(jì)算next數(shù)組(附件里為pi數(shù)組)。next[i]=k,k<i(注意這里不取等號,想想為什么),s[0...k]是s的proper prefix,也是s[0...i]的proper suffix,且k是最大的(即不存在l>k,s[0...l]是s[0...i]的proper prefix且是s[0...i]的proper suffix)。

            那么next[0]=-1就很自然地被理解:表示的是空串是s[0...0]的proper prefix且是s[0...0]的proper suffix。
            另外k嚴(yán)格小于i也可以理解:若k==i,但s[0...i]不是s[0...i]的proper prefix 也不是proper suffix,這跟定義沖突。

            上述可以用下圖來說明。


            上面的式子定義了next數(shù)組,但還沒有指出怎么計(jì)算next。假設(shè)next[0...i]已經(jīng)計(jì)算出來了,next[i+1]怎么算。
            這里用的是動態(tài)規(guī)劃的思想。設(shè)s[0...k+1]是s[0...i+1]最長的proper prefix且是proper suffix,k<i,則明顯地s[0...k+1]符合以下性質(zhì):

            1. s[0...k]是s[0...i]的proper prefix (這一點(diǎn)很明顯,由于k<i)
            2. 且s[0...k]是s[0...i]的proper suffix (若不然,s[0...k+1]肯定無法組成s[0...i+1]的suffix)
            3. 且s[k+1]==s[i+1]。

            因此我們的任務(wù)就是找到這樣一個(gè)k。而s[0...k]是s[0...i]的proper prefix 和proper suffix這個(gè)性質(zhì)使得我們可以利用已計(jì)算的next[0...i]來找k。

            找的過程實(shí)質(zhì)就是找到s[0...i+1]一個(gè)最長的proper prefix s[0...k], 這個(gè)prefix 同時(shí)是s[0...i+1]的proper suffix且有s[i+1]==s[k+1],見下圖:

            假設(shè)s[0...kx]都是s[0...i+1]的proper prefix,且都是s[0...i]的proper suffix。設(shè)s[k1+1] != s[i+1],則s[0...k1+1]不可能是s[0...i+1]的proper suffix。
            設(shè)s[k2+1] = = s[k3+1] = = s[i+1],但由于k3>k2,所以next[i+1] = k3+1

            下面看poj上的一道題目的代碼:
             1 #include <iostream>
             2 
             3 using namespace std;
             4 
             5 char w[10001],t[1000001];
             6 int n;
             7 int next[10001];
             8 
             9 int main()
            10 {
            11     scanf("%d",&n);
            12     while(n--){
            13         scanf("%s",w);
            14         scanf("%s",t);
            15         // process w
            16         int wLength = strlen(w);
            17         next[0]=-1;
            18         int i=1;
            19         int p;
            20         while(i<wLength){
            21             p=next[i-1];
            22             while(p!=-1 && w[p+1]!=w[i]) p=next[p];
            23             if(w[p+1]==w[i]) next[i]=p+1;
            24             else next[i]=-1;
            25             i++;
            26         }
            27         //for(i=0;i<wLength;i++) printf("%d",next[i]);
            28         //printf("\n");
            29         // matching
            30         int j=-1,cnt=0;
            31         i=-1;
            32         int tLength = strlen(t);
            33         while(j<tLength){
            34             if(t[j+1]==w[i+1]){
            35                 i++;
            36                 j++;
            37                 if(i==wLength-1){
            38                     cnt++;
            39                     i=next[i];
            40                 }
            41             }else{
            42                 if(i==-1) j++;
            43                 else i=next[i];
            44             }
            45         }
            46         printf("%d\n",cnt);
            47     }
            48     return 1;
            49 }
            50 


            posted on 2008-07-25 11:45 bon 閱讀(399) 評論(0)  編輯 收藏 引用 所屬分類: Programming Contest
            Google PageRank 
Checker - Page Rank Calculator
            久久精品国产亚洲精品2020| 久久亚洲精品国产精品婷婷| 久久久久青草线蕉综合超碰 | 三级三级久久三级久久| 国产精品久久午夜夜伦鲁鲁| 人妻精品久久久久中文字幕69| 国内精品久久国产| 中文字幕无码久久精品青草| 国产午夜电影久久| 精品国产热久久久福利| 国产亚洲色婷婷久久99精品91| 久久成人精品| 久久免费视频1| 久久国产精品一国产精品金尊| 久久精品无码午夜福利理论片| 激情伊人五月天久久综合| 久久久一本精品99久久精品66| 97久久久精品综合88久久| 99久久免费国产精品热| 国产高潮国产高潮久久久91 | 94久久国产乱子伦精品免费| 国产激情久久久久影院小草 | 久久国产欧美日韩精品| 精品综合久久久久久97| 91精品国产高清91久久久久久| 国产精品久久久久久搜索| 久久99精品久久久久久水蜜桃| 伊人久久大香线蕉AV一区二区| 国产精品久久久久久五月尺| 日韩人妻无码一区二区三区久久 | 香蕉久久一区二区不卡无毒影院| 国产精品综合久久第一页| 三级三级久久三级久久| 久久香蕉综合色一综合色88| 欧美伊人久久大香线蕉综合69| 久久久久久精品成人免费图片| 久久久av波多野一区二区| 无夜精品久久久久久| 久久精品国产亚洲AV电影| 久久丝袜精品中文字幕| 久久精品人人做人人妻人人玩|