字符串匹配算法,时间复杂度为O(n+m)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAX_N=100;
const int M=1e9+7;
char s[100005],p[100005];
int net[100005];
void getnext(char *p){
int lenp=strlen(p);
net[0]=-1;
int k=-1;
int j=0;
while(j<lenp-1){
if(k==-1||p[j]==p[k]){
j++;
k++;
net[j]=k;
}
else k=net[k];
}
}
int kmp(char *s,char *p){
int lens=strlen(s);
int lenp=strlen(p);
int i=0,j=0;
while(i<lens&&j<lenp){
if(j==-1||s[i]==p[j]){
i++;
j++;
}
else j=net[j];
}
if(j==lenp)return i-j;
return -1;
}
int main()
{
scanf("%s%s",&s,&p);
getnext(p);
printf("%d\n",kmp(s,p));
return 0;
}