poj3461 KMP的应用
这道题就是让你求W串在S串中出现的次数, 我们可以在W后面加一个不会出现的字符, 然后KMP每匹配到W最后一个字符的末尾就给答案加一, 然后强行让当前为和目标串不匹配即可, 代码如下:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; char T[10000+10], S[1000000+100]; int tlen, slen; int next[10000+10]; void getnext(){ int i=0, j=-1; next[0] = -1; while(i<tlen){ if(j==-1 || T[i]==T[j]){ ++i; ++j; next[i]=T[i]==T[j]?next[j]:j; }else j = next[j]; } } int main(){ int TT; scanf("%d", &TT); while(TT--){ scanf("%s%s", T, S); tlen = strlen(T); slen = strlen(S); //printf("%s %d", T, tlen); getnext(); // for(int i=0; i<=tlen; i++) { // printf("%d ", next[i]); // } int res = 0; int i=0, j=0; while(i<slen){ if(j==-1 || S[i]==T[j]) ++i, ++j; else j = next[j]; if(j==tlen) res++, j = next[tlen]; } printf("%d\n", res); } return 0; }