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;
}

 

posted @ 2016-03-18 20:41  xing-xing  阅读(105)  评论(0编辑  收藏  举报