kmp模板

来源:互联网 发布:淘宝旅行网机票预订 编辑:程序博客网 时间:2024/06/02 01:48
 我的习惯写法, 自己复习用:
#include<cstdio>#include<cstring>#define N 1005char a[N], b[N];int d1, d2;int next[N];void Get_next(){    int i, j;    i=1, j=0;    next[1]=0;    while(j<d2){        if(j==0||b[i]==b[j]){            i++;            j++;            if(b[i]!=b[j]){                next[i]=j;            }            else {                next[i]=next[j];            }        }        else {            j=next[j];        }    }}int kmp(){    int i=0, j=0, cnt=0;    while(i<=d1){        if(j==0||a[i]==b[j]){            if(j==d2){             //cnt++;j=0;   子串匹配主串的个数                return i-j+1;       //返回的是子串在主串中匹配的第一个位置;            }            i++;            j++;        }        else j=next[j];    }    return -1;    //无匹配则返回-1;      //return cnt;}int main(){    scanf("%s%s", a+1, b+1);    d1=strlen(a+1);           //注意在a[1]出开始读入;a[1]处开始计算;    d2=strlen(b+1);    Get_next();    printf("%d\n", kmp());}
背模板,背模板..............


下面是再次整理的:
#include<cstdio>#include<cstring>#define MAX 1000000char a[MAX], b[MAX];int d1, d2;int next[MAX];void get_next(){    int i, j;    i=0, j=-1;    next[0]=-1;    //数组从0开始,之前是从1开始    while(i<d2)    {        if(j==-1||b[i]==b[j])        {            i++;            j++;            if(b[i]!=b[j])            {                next[i]=j;            }            else next[i]=next[j];        }        else j=next[j];    //j进行回溯,    }}int kmp(){    int i=0, j=0, cnt=0;    while(i<=d1)    {        if(j==-1||a[i]==b[j])        {            i++;            j++;            if(j==d2)            {                cnt++;               // j=0;  计算不重复匹配时加上;如aaaaaa中aa有三个;            }        }        else j=next[j];   //j进行回溯    }    return cnt;}int main(){    int t;    scanf("%d", &t);    for(int i=0; i<t; i++)    {        scanf("%s%s", (b), (a));        //由于数组从0开始,这里改了.        d1=strlen(a);        d2=strlen(b);        get_next();        printf("%d\n", kmp());    }}
和之前稍有不同,建议用下面的模板.
0 0
原创粉丝点击