LibreOJ #103. 子串查找

题目描述

这是一道模板题。

给定一个字符串 A AA 和一个字符串 B BB,求 B BB 在 A AA 中的出现次数。

A AA 中不同位置出现的 B BB 可重叠。

输入格式

输入共两行,分别是字符串 A AA 和字符串 B BB。

输出格式

输出一个整数,表示 B BB 在 A AA 中的出现次数。

样例

样例输入

zyzyzyz
zyz

样例输出

3

数据范围与提示

1≤A,B 1 \leq A, B1A,B 的长度 ≤106 \leq 10 ^ 6106​​,A AA、B BB 仅包含大小写字母。

kmp模板题 

屠龙宝刀点击就送

#include <cstring>
#include <cstdio>
const int N = 1e6+5;
int la,lb,Next[N];
char A[N],B[N];
void Get_next()
{
    int i=0,j=-1;
    Next[i]=j;
    for(;i<lb;)
    {
        if(j==-1||B[i]==B[j]) i++,j++,Next[i]=j;
        else j=Next[j];
    }
}
int kmp()
{
    Get_next();
    int ans=0,i=0,j=0;
    for(;i<la&&j<lb;)
    {
        if(j==-1||B[j]==A[i]) i++,j++;
        else j=Next[j];
        if(j==lb) {ans++;j=Next[j];}
    }
    return ans;
}
int main()
{
    scanf("%s",A);
    scanf("%s",B);
    la=strlen(A),lb=strlen(B);
    printf("%d\n",kmp());
    return 0; 
}

 

posted @ 2017-08-14 20:59  杀猪状元  阅读(472)  评论(0编辑  收藏  举报