theArcticOcean

博观而约取,厚积而薄发

poj 3461 Oulipo(KMP)

题目:http://poj.org/problem?id=3461

大意是这样的:在一篇没有空格的文章中找到给定的词,统计出现的次数输出。

用KMP求出前缀-后缀编码,将词当做模式串在文章中不断移动寻找相同的词。

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn1=1e4+5,maxn2=1e6+5;
char s1[maxn1],s2[maxn2];
int snext[maxn1],len;
void getnext(){
    int i=0,j=-1;
    snext[0]=-1;
    while(i<=len){
        if(j==-1||s1[i]==s1[j])snext[++i]=++j;
        else j=snext[j];
    }
}
int main()
{
    //freopen("cin.txt","r",stdin);
    int t,i,j;
    cin>>t;
    while(t--){
        scanf("%s%s",s1,s2);
        len=strlen(s1);
        getnext();
        int ans=0,length=strlen(s2);
        i=0,j=0;
        while(i<length){
            if(j==-1||s1[j]==s2[i]){
                i++;
                j++;
            }
            else j=snext[j];
            if(j==len){
                ans++;
                j=snext[j];
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/theArcticOcean/article/details/46813041
文章标签: poj kmp
个人分类: algorithm_字符串
上一篇poj 2406 Power String (KMP)
下一篇poj 2185 Milking Grid(KMP)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭