void getnext(string s){//获得next数组
int i,j;
i=0,j=-1;
nxt[0]=-1;
while(i<s.size()){
if(j==-1||s[i]==s[j]){
nxt[++i]=++j;
}
else
j=nxt[j];
}
}
或者
void get_Next(string s){
int j=0;
nxt[0]=-1;
for(int i=1;i<s.size();i++){
while(j>0&&s[i]!=s[j])j nxt[j-1];
if(s[i]==s[j]){
j++;
}
nxt[i]=j;
}
}
int kmp(string s, string t){//kmp 匹配
if(t.size()==0) return 0;
get_Next(t, next);
int j = 0;
for(int i=0;i<s.size();i++){
while(j>0&&s[i]!= t[j]) j=next[j-1];
if(s[i]==t[j]) j++;
if(j==t.size()) return i-t.size()+1;
}
return -1;
}
模板二
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
char a[N], b[N];
int nxt[N];
int T, n, m;
int solve(char *a, char *b, int n, int m) {
for (int i = 2; i <= n; i++) {
int k = nxt[i - 1];
while (k && a[i] != a[k + 1]) k = nxt[k];
if (a[i] == a[k + 1]) ++k;
nxt[i] = k;
}
int k = 0;
for (int i = 1; i <= m; i++) {
while (k && b[i] != a[k + 1]) k = nxt[k];
if (b[i] == a[k + 1]) ++k;
if (k == n) return i-n+1;
}
return -1;
}
int main() {
scanf("%d", &T);
while (T--) {
scanf("%s%s", a + 1, b + 1);
n = strlen(a + 1); m = strlen(b + 1);
cout<<solve(a, b, n, m)<<endl;
//b里面找a
}
return 0;
}
286

被折叠的 条评论
为什么被折叠?



