1. 程式人生 > >KMP演算法(字串)

KMP演算法(字串)

純模板題:HDU1686

#include<cstdio>
#include<cstdlib>
#include<cstring>
#define INF 1000005

int next[INF];
char a[INF],b[INF];
void getnext(char *str)
{
    int j=0;
    int len=strlen(str);
    next[0]=0;
    for(int i=1;i<len;i++)
    {
        while(j>0&&str[i]!=str[j])
              j=next[j-1];
        if(str[i]==str[j])
            j++;
        next[i]=j;
    }
}

int kmp(char *str1,char *str2)
{
    int len1=strlen(str1),len2=strlen(str2); //str1是待匹配串,str2是匹配串
    int j=0,ans=0;
    for(int i=0;i<len2;i++)
    {
        if(str1[j]!=str2[i]&&j>0)
            j=next[j-1];
        if(str1[j]==str2[i])
            j++;
        if(j==len1) //相等說明找到子串
            ans++;
    }
    return ans;

}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",a);
        getnext(a);
        scanf("%s",b);
        int ans=kmp(a,b);
        printf("%d\n",ans);
    }
    return 0;
}

next陣列的運用(HDU3746)

#include<cstdio>
#include<cstring>
#define INF 1000005

int next[INF];
char inp[INF];
void getnext(char *a,int n)
{
    int i=0,j=next[0]=-1;
    while(i<n)
    {
        while(j!=-1&&inp[i]!=inp[j])
            j=next[j];
        i++;j++;
        next[i]=j;
    }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",inp);
        int n=strlen(inp);
        getnext(inp,n);
        int ans=n-next[n];
        if(n!=ans&&n%ans==0) printf("0\n");
        else
        {
            ans=ans-next[n]%ans;
            printf("%d\n",ans);
        }
    }
    return 0;
}