KMP模版 && KMP求子串在主串出现的次数模版

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP模版 && KMP求子串在主串出现的次数模版相关的知识,希望对你有一定的参考价值。

int next[MAX_LEN];
void creat_next(char *S, int Sn)
{
    int k, q;
    next[0] = 0;
    for(k=0, q=1; q<Sn; q++){
        while(k>0 && S[k]!=S[q]) k = next[k-1];
        if(S[k] == S[q]){
            k++;
        }
        next[q] = k;
    }
}
bool Judge(char *S, char *T, int Sn, int Tn)//S是子串,T是主串
{
    int q, i;
    for(i=0, q=0; i<Tn&&q<Sn; i++){
        while(q>0 && S[q]!=T[i]) q = next[q-1];
        if(S[q] == T[i])
            q++;
    }
    return (q == Sn)?true:false;
}

求次数

int next[maxn];  
char S[maxn], T[maxn * 100];  
void creat_next() {  
    int i = 0, j = -1;  
    next[i] = j;  
    while(S[i]) {  
        if(j == -1 || S[i] == S[j]) {  
            ++i; ++j;  
            if(S[i] == S[j])   
                next[i] = next[j];  
            else next[i] = j;  
        } else j = next[j];  
    }  
}  
int KMP_count() {
    creat_next();  
    int i = 0, j = 0, ans = 0;  
    while(T[i]) {  
        if(j == -1 || T[i] == S[j]) {  
            ++i; ++j;  
            if(!S[j]) {  
                ++ans; j = next[j];  
            }  
        } else j = next[j];  
    }  
    return ans;
} 

 

以上是关于KMP模版 && KMP求子串在主串出现的次数模版的主要内容,如果未能解决你的问题,请参考以下文章

KMP小扩展,找出子串在主串中出现的所有位置

KMP算法

马拉车——模版+KMP——模版

数据结构14——AC自动机

字符串匹配(KMP)

poj 2406 Power Strings求子串在主串中最多叠加次数