POJ3461 Oulipo KMP算法应用

来源:互联网 发布:slam算法介绍 编辑:程序博客网 时间:2024/06/09 14:03

题目描述

给定主串和模式串,问模式串在主串中出现的次数

Sample Input
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN


Sample Output
1
3
0


解题思路:KMP算法是找到一个匹配就跳出,这题是要计数,所以我们把KMP算法稍微改一下即可,在找到一个匹配(即j=模式串长度)时计数器++,再从next[j]开始找就好了。详见代码

#include <cstdio>#include <cstring>void GetNext(char* p,int next[]){    int pLen = strlen(p);    int k = -1;//k记录的是next[j]    next[0] = k;    int j = 0;    while (j < pLen) {        /** next[j]=-1时,next[j+1]肯定是0;p[j]=p[k]时,next[j+1]=next[j]+1 */        if (k == -1 || p[j] == p[k]) {            ++k;            ++j;            if(p[j] != p[k]) next[j] = k;            else next[j] = next[k];        }        else k = next[k];    }}const int maxn = 1000010;char s[maxn];char p[10010];int next[10010];int main(){    int t;    scanf("%d",&t);    while(t--) {        scanf("%s",p);        GetNext(p,next);        int cnt = 0;        scanf("%s",s);        int i=0,j=0;        int len1=strlen(s),len2=strlen(p);        while(i < len1) {            if(j == -1 || s[i] == p[j]) {                ++i;                ++j;                if(j == len2) {  //找到了一个匹配串                    cnt++;       //计数器++                    j = next[j]; //从next[j]继续开始匹配                }            }else j = next[j];        }        printf("%d\n",cnt);    }    return 0;}


0 0