1. 程式人生 > >Count the string[KMP]HDU3336

Count the string[KMP]HDU3336

題庫連結http://acm.hdu.edu.cn/showproblem.php?pid=3336 

  這道題是KMP的next陣列的一個簡單使用,首先要理解next陣列的現實意義:next[i]表示模式串的前i個字元所組成的字串的最長字首字尾匹配長度,就比如對於字串"abcdabe",它的next[3]=0,因為前三個字元構成的字元子串"abc"前後綴最長匹配長度為0,而next[6]=2,因為對於子串"abcdab",它的字首字尾最大可以匹配出"ab",長度為2,對應了它的字首字尾最大匹配長度。

  對於這道題,我們從1位置開始遍歷整個next陣列,首先每一個字首串自身都對答案有1的貢獻,所以首先ans++,此外,當與到next[i]數值大於0的位置,說明前i個字元組成的子串有大於零的字首字尾匹配,即字首串在該位置重複出現了一次,所以此時ans再加1。

 詳見程式碼:

#include<bits/stdc++.h>

using namespace std;
char s[200010];
int t,n,nex[200010];
int ans;

void getNex(){
    nex[0]=-1;
    int k=-1,j=0;
    while(j<n){
        if(k==-1||s[j]==s[k]){
            ++j;++k;
                nex[j]=k;
        }
        else k=nex[k];
    }
}
int main(){
    scanf("%d",&t);
    while(t--){
        ans=0;
        scanf("%d%s",&n,s);
        getNex();
        for(int i=1;i<=n;i++){
            ans++;
            if(nex[i]!=0)
                ans++;
            ans%=10007;
        }
        printf("%d\n",ans);
    }
    return 0;
}
xxmlala-Code