7-1 字符串模式匹配(KMP)分数 30
作者 李廷元
单位 中国民用航空飞行学院
给定一个字符串 text 和一个模式串 pattern,求 pattern 在text 中的出现次数。text 和 pattern 中的字符均为英语大写字母或小写字母。text中不同位置出现的pattern 可重叠。
输入格式:
输入共两行,分别是字符串text 和模式串pattern。
输出格式:
输出一个整数,表示 pattern 在 text 中的出现次数。
输入样例1:
zyzyzyz
zyz
输出样例1:
3
输入样例2:
AABAACAADAABAABA
AABA
输出样例2:
3
数据范围与提示:
1≤text, pattern 的长度 ≤106, text、pattern 仅包含大小写字母。
代码长度限制
16 KB
时间限制
500 ms
内存限制
64 MB
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
string S, T;
int Next[N];
void get_next()
{
int i = 0, j = -1;
Next[i] = -1;
while (i < T.size())
{
if (j == -1 || T[i] == T[j])
{
Next[++i] = ++j;
}
else
j = Next[j];
}
}
int kmp(int pos)
{
int i = pos, j = 0, ans = 0;
while (i < S.size())
{
if (S[i] == T[j] || j == -1)
++i, ++j;
else
j = Next[j];
if (j == T.size())
{
ans++;
//j = Next[j - 1];
//i--;
j=Next[j];
}
}
return ans;
}
int main()
{
cin >> S;
cin >> T;
get_next();
int ans = kmp(0);
cout << ans << endl;
return 0;
}