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
", ans);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/Apro/p/4778057.html