#include<bits/stdc++.h>
using namespace std;
void InitNext(string T, int *next){
int i = 1, j = 0;
next[1] = 0;
while(i < T.size())
if (j == 0 || T[i-1] == T[j-1]){
++i;
++j;
next[i] = j;
}
else
j = next[j];
}
int IndexKMP(string S, string T, int pos){
int i = pos;
int j = 1;
int next[255];
InitNext(T, next);
while(i <= S.size() && j <= T.size())
if (j == 0 || S[i-1] == T[j-1]){
++i;
++j;
}
else
j = next[j];
if (j > T.size())
return i - T.size();
else
return 0;
}
int main()
{
string S, T;
cin>>S>>T;
int ans = IndexKMP(S, T, 1);
if (ans) cout<<ans<<endl;
else cout<<"-1"<<endl;
return 0;
}
补上不用STL的模板:
#include<bits/stdc++.h>
using namespace std;
void InitNext(char *s, int *next){
int i = 0, j = -1, len = strlen(s);
next[0] = -1;
while(i < len){
if (j == -1 || s[i] == s[j]){
++i;
++j;
next[i] = j;
}
else j = next[j];
}
}
int IndexKMP(char T[], char s[], int *next){
int i = 0, j = -1, l = strlen(s), L = strlen(T);
InitNext(s, next);
while(j < l && i < L){
if (j == -1 || T[i] == s[j]){
++i;
++j;
}
else j = next[j];
}
if (j >= l) return i-j+1;
else return 0;
}
int main()
{
char T[200], s[20];
int next[20];
scanf("%s %s", T, s);
int ans = IndexKMP(T, s, next);
cout<<ans<<endl;
return 0;
}