您的位置:首页 > 其它

POJ 3461 Oulipo (KMP模板题)

2015-02-10 15:39 330 查看
求模式串在给定文本串中出现的次数。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<ctime>
#define eps (1e-8)

using namespace std;

typedef long long ll;
const int maxn = 1000010;
const int maxm = 10010;
int f[maxm],m,ans,n;
char P[maxm],T[maxn];

void getnext()
{
    f[0] = 0,f[1] = 0;
    for(int i=1;i<m;i++){
        int j = f[i];
        while(j && P[j]!=P[i]) j=f[j];
        f[i+1] = (P[j]==P[i])?j+1:0;
    }
}
void KMP()
{
    n = strlen(T);
    m = strlen(P);
    getnext();
    int j = 0;
    for(int i=0;i<n;i++){
        while(j && P[j]!=T[i]) j=f[j];
        if(P[j]==T[i]) j++;
        if(j==m) ans++;
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s%s",P,T);
        ans = 0;
        KMP();
        printf("%d\n",ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: