1. 程式人生 > 其它 >Go打包二進位制檔案

Go打包二進位制檔案

程式碼:

char s[MAXN],p[MAXN];//在s裡找子串p
int n,m,nxt[MAXN];//字首函式nxt[i]:p中[0,nxt[i]-1]==[i-nxt[i]+1,i]
void get_next() {
  for(int i=1,j=0;nxt[i]=0,i<m;++i) {//j為上一個位置的nxt值
    while(j&&p[i]!=p[j])j=nxt[j-1];
    nxt[i]=j=j+(p[i]==p[j]);
  }
}
void kmp(){
    get_next();
    for(int i=0,j=0;i<n;){
        while(j&&s[i]!=p[j])j=nxt[j-1];
        if(j+=s[i]==p[j],++i,j==m){j=nxt[j-1];}//子串p在i-m位置
    }
}

假設上面是字串s,下面是p。

假設匹配到了字元a!= b。
當前next[j]的值就是串3的長度

因為串1234都是一樣的,所以j跳回到串3的最後面。

串2和3是相等的,所以直接比較串2和串3後面的字元就行了

最麻煩的就是next陣列,next[j]是除去字元j後p[0,j-1]這個子串裡字首和字尾相等的最長長度。
這裡只考慮出現不同字元的情況,否則就直接+1
k最開始是指向字元a的,但是a!=j指向的字元,所以k=next[k]
即k指向前k個字元組成的串的next值,就是下圖所示。

如圖,又有4個子串是一樣的,繼續比較k指向的字元和j指向的字元就行了,顯然就是一個遞迴的過程。