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, B1≤A,B 的长度 ≤106 \leq 10 ^ 6≤106,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; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。