POJ 3461 Oulipo

题意:给俩字符串,问第一个字符串在第二个里面出现了几次。

 

解法:kmp。好裸……

 

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
char w[10005], t[1000005];
int p[10005], lw, lt, ans;
void getnext()
{
    int j = 0;
    memset(p, 0, sizeof p);
    for(int i = 1; i < lw; i++)
    {
        while(j > 0 && w[j] != w[i]) j = p[j];
        if(w[j] == w[i]) j += 1;
        p[i + 1] = j;
    }
}
void find()
{
    int j = 0;
    for(int i = 0; i < lt; i++)
    {
        while(j > 0 && w[j] != t[i]) j = p[j];
        if(w[j] == t[i]) j += 1;
        if(j == lw)
        {
            ans += 1;
            j = p[j];
        }
    }
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        ans = 0;
        scanf("%s%s", w, t);
        lw = strlen(w);
        lt = strlen(t);
        getnext();
        find();
        printf("%d\n", ans);
    }
    return 0;
}

  

posted @ 2015-09-02 11:22  露儿大人  阅读(104)  评论(0编辑  收藏  举报