题目
#include <iostream>
#include <string>
using namespace std;
const int N = 100010, M = 1000010;
int n, m;
char s[M], p[N];
int * findNext(string p){
int j = 0;
int k = -1;
int m = p.length();
int * next = new int[m+10];
next[0] = -1;
while (j <= m-1){
while (k >= 0 && p[k] != p[j]){
k = next[k];
}
j++; k++;
next[j]=k;
}
return next;
}
void KMPStrMatching(string s, string p, int *N){
int j = 0;
int i = 0;
int plen = p.length();
int slen = s.length();
while (j < plen&&i < slen){
if (j == -1 || s[i] == p[j])
i++, j++;
else j = N[j];
if (j == plen){
cout << i - plen<<" ";
j = N[j];
}
}
}
int main(){
cin >> n >> p >> m >> s ;
int* ne= findNext(p);
KMPStrMatching(s, p, ne);
return 0;
}
int * findNext(string p){
int j = 0;
int k = -1;
int m = p.length();
int * next = new int[m+10];
next[0] = -1;
while (j <= m - 1){
while (k >= 0 && p[k] != p[j]){
k = next[k];
}
j++; k++;
next[j] = k;
}
return next;
}
int KMPStrMatching(string s, string p, int *N){
int j = 0;
int i = 0;
int plen = p.length();
int slen = s.length();
if (slen < plen) return -1;
while (j < plen&&i < slen){
if (j == -1 || s[i] == p[j])
i++, j++;
else j = N[j];
}
if (j >= plen)
return i - plen;
else return -1;
}
不错的解法