#include <bits/stdc++.h>
#define bug printf("************************\n");
#define fuck(x) cout << #x << " -> " << x << endl
#define endl '\n'
#define int long long
using namespace std;
constexpr int N = 1e6, inf = 0x3f3f3f3f;
char p[N], s[N];
int ne[N];
// s[]是长文本,p[]是模式串,下标由1开始读入
int kmp(int n, int m) // n为长,m为短(长度)
{
// 求ne数组
int ans = 0;
for (int i = 2, j = 0; i <= m; i++)
{
while (j && p[i] != p[j + 1])
j = ne[j];
if (p[i] == p[j + 1])
j++;
ne[i] = j;
}
// 匹配
for (int i = 1, j = 0; i <= n; i++)
{
while (j && s[i] != p[j + 1])
j = ne[j];
if (s[i] == p[j + 1])
j++;
if (j == m)
{
j = ne[j];
ans++;
// 匹配成功后的逻辑
}
}
return ans;
}
void change(char *s, int n)
{
for (int i = 1; i <= n; i++)
{
if (isupper(s[i]))
{
s[i] = tolower(s[i]);
}
}
}
void solve()
{
int n, m;
cin >> m >> n;
cin >> p + 1 >> s + 1;
change(p, m);
change(s, n);
cout << kmp(n, m) << endl;
}
signed main()
{
ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T;
cin >> T;
while (T--)
solve();
return 0;
}
P8835 [传智杯 #3 决赛] 子串 —KMP
最新推荐文章于 2024-09-27 11:26:03 发布