【HDU 2087 剪花布条 】 KMP

HDU2087
题意就是求B串在A串中的出现次数(不可重叠)
做法和上题类似,只不过在每次完成匹配之后,要考虑不能重叠的问题,所以j不能跳转到next[j],而应该从0重新开始,因为A中已经匹配过的字符不能再利用,所以就变成了A剩下的子串中找B出现的次数,所以j应该从0重新开始匹配。
HDU2087代码

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std ;
const int maxn = 1e6+5;
int Next[maxn];
char str[maxn];
char mo[maxn];
int n1,n2;
void GetNext()
{
    int i=0,j=-1;
    while(i<n2)
    {
        if(j==-1||mo[i]==mo[j]) {++i,++j,Next[i]=j;}
        else j=Next[j];
    }
    return ;
}
int kmp()
{
    int cnt=0;
    int i=0,j=0;
    while(i<n1)
    {
        if(j==-1||str[i]==mo[j]) i++,j++;
        else j=Next[j];
        if(j==n2)
        {
            cnt++;
            j=0;
        }
    }
    return cnt;
}
int main()
{
    while(scanf("%s",str)!=EOF)
    {
        n1=strlen(str);
        if(n1==1&&str[0]=='#') break;
        scanf("%s",mo);
        n2=strlen(mo);
        Next[0]=-1;
        GetNext();
        printf("%d\n",kmp());
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38891827/article/details/80501650