kmp算法模板

来源:互联网 发布:网上招淘宝客服可信吗 编辑:程序博客网 时间:2024/05/19 00:54

kmp算法:

//求解原串中包含多少模式串,模式串可以互相覆盖,不能覆盖的稍微修改一下即可char ori[N*100], pat[N];//ori为原串,pat为模式串int Next[N];//两个get_next函数,任选其一//void get_next(char *pat)//{//    int i = 0, j = -1;//    Next[0] = -1;//    while(pat[i])//    {//        if(j == -1 || pat[i] == pat[j]) Next[++i] = ++j;//        else j = Next[j];//    }//}void get_next(char *pat){    int i = 0, j = -1;    Next[0] = -1;    while(pat[i])    {        if(j == -1 || pat[i] == pat[j])        {            ++i, ++j;            if(pat[i] != pat[j]) Next[i] = j;            else Next[i] = Next[j];        }        else j = Next[j];    }}int kmp(char *ori, char *pat){    get_next(pat);    int ans = 0;    int i = 0, j = 0;    while(ori[i])    {        if(j == -1 || ori[i] == pat[j]) ++i, ++j;        else j = Next[j];        if(j != -1 && !pat[j]) ans++, j = Next[j];//模式串不能互相覆盖,改j=0即可    }    return ans;}int main(){    int t;    scanf("%d", &t);    while(t--)    {        scanf("%s%s", pat, ori);        int ans = kmp(ori, pat);        printf("%d\n", ans);    }    return 0;}
//求解字符串的最大循环次数,也就是先求出最小循环周期,在用长度除之const int N = 1000000 + 10;char ori[N], pat[N];int Next[N];void get_next(char *pat)//必须用这个get_next函数{    int i = 0, j = -1;    Next[0] = -1;    while(pat[i])    {        if(j == -1 || pat[i] == pat[j]) Next[++i] = ++j;        else j = Next[j];    }}int main(){    while(~scanf("%s", pat))    {        get_next(pat);        int len = strlen(pat);        //满足len % (len - Next[len]) == 0说明字符串是循环的,否则不循环        if(len % (len - Next[len]) == 0) printf("%d\n", len / (len - Next[len]));        else printf("1\n");    }    return 0;}