您的位置:首页 > 其它

KMP算法模板

2015-07-27 23:53 393 查看
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int N, fail[2000000], ANS[2000000];
char pat[2000000], text[2000000];
inline void KMP() {
int n = strlen(pat);
for (int i = 0; i <= n + 1; i++) fail[i] = 0;
for (int i = 1; i <= n - 1; i++) {
int j = i;
while (j>0) {
j = fail[j];
if (pat[j] == pat[i]) {
fail[i + 1] = j + 1;
break;
}
}
}
ANS[0] = 0;
int m = strlen(text);
for (int i = 0, j = 0; i <= m - 1; i++) {
if (j <= n - 1 && text[i] == pat[j]) j++;
else {
while (j > 0) {
j = fail[j];
if (text[i] == pat[j]) {
j++; break;
}
}
}
if (j == n) ANS[++ANS[0]] = i - n + 1;
}
}
int main() {
scanf("%d", &N);
while (N--) {
cin >> pat >> text;
KMP();
printf("%d\n", ANS[0]);
}
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: