码迷,mamicode.com
首页 > 编程语言 > 详细

POJ3461 Oulipo KMP算法应用

时间:2015-01-30 17:45:31      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

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

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


POJ3461 Oulipo KMP算法应用

标签:

原文地址:http://blog.csdn.net/area_52/article/details/43308911

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!