模板:
void get_next(){
int pLen = strlen(p);
nxt[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1){
if(k == -1 || p[j] == p[k]){
++k;
++j;
nxt[j] = k;
}
else{
k = nxt[k];
}
}
}
int kmp(){
int i = 0;
int j = 0;
int sLen = strlen(s);
int pLen = strlen(p);
while (i < sLen && j < pLen){
if(j == -1 || s[i] == p[j]){
i++;
j++;
}
else{
j = nxt[j];
}
}
if (j == pLen) return i - j;
else return -1;
}
POJ 3461
看样例应该知道题意了叭QAQ
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn = 1e6 + 5;
char T[10005];
char S[maxn];
int nxt[10005];
int S_len,T_len,ans,t;
void get_nxt(){
nxt[0] = -1;
int k = -1;
int j = 0;
while(j < T_len - 1){
if(k == -1 || T[j] == T[k]){
++k;
++j;
nxt[j] = k;
}
else k = nxt[k];
}
}
int kmp(){
int i = 0;
int j = 0;
while(i < S_len){
if(j == -1 || S[i] == T[j]){
i++;
j++;
}
else j = nxt[j];
if(j == T_len){
ans++;
i --;
j = nxt[j - 1];
}
}
return ans;
}
int main()
{
scanf("%d",&t);
while(t--){
ans = 0;
scanf("%s",T);
scanf("%s",S);
S_len = strlen(S);
T_len = strlen(T);
get_nxt();
ans = kmp();
cout << ans << endl;
}
}