#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
int nxt[maxn];
char a[maxn], b[maxn];
void getNext(char p[]) {
int i = 0, k = -1, len = strlen(p);
nxt[i] = -1;
while(i < len) {
if(k == -1 || p[i] == p[k]) {
if(p[++i] != p[++k]) nxt[i] = k;
else nxt[i] = nxt[k]; // 注意
} else k = nxt[k];
}
}
// 匹配次数
int kmp_match(char t[], char p[]) {
int i = 0, j = 0, cnt = 0;
int n = strlen(t), m = strlen(p);
while(i <= n - 1) {
if(j < 0 || t[i] == p[j]) i++, j++;
else j = nxt[j];
if(j == m) cnt++, j = nxt[j];
}
return cnt;
}
// 匹配位置
int kmp_search(char t[], char p[]) {
int i = 0, j = 0;
int n = strlen(t), m = strlen(p);
while(i < n && j < m) {
if(j < 0 || t[i] == p[j]) i++, j++;
else j = nxt[j];
}
if(j == m) return i - j + 1;
else return -1;
}
int main() {
int n, m, T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
scanf("%s%s", a, b);
getNext(b);
int ans = kmp_search(a, b);
printf("%d\n", ans);
}
}
KMP
最新推荐文章于 2024-11-16 09:45:51 发布