poj3461 Oulipo,Kmp

来源:互联网 发布:mac下载阿里旺旺 编辑:程序博客网 时间:2024/06/06 08:47


计算串x在y中重复了多少次,可重叠。



/************************************************ * Author: yew1eb * Created Time: 2014/3/6 16:30:33 * File Name: poj3461.cpp *************************************************/#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <cmath>#include <stack>#include <queue>#include <ctime>#include <set>#include <map>using namespace std;#define INF 0x3f3f3f3f#define eps 1e-8#define pi acos(-1.0)typedef long long ll;const int maxn = 10000 + 10;int f[maxn];void getFail(char* P, int* f)  {      int i, j;      int m = strlen(P);      j = f[0] = -1;      i = 0;      while(i<m)      {          while(-1!=j && P[i] != P[j] ) j = f[j];          f[++i] = ++j;      }  }  int count(char* x, char* y){    int n = strlen(y);    int m = strlen(x);    getFail(x, f);    int j = 0;    int ans = 0;    for(int i=0; i < n; ++i)    {        while(j && y[i] != x[j]) j = f[j];        if(y[i] == x[j] ) j++;        if(j >= m)         {            ans++;            j = f[j];        }    }    return ans;}int main(){    int n;    char x[maxn], y[1000000 + 10];    while(~scanf("%d",&n) )    {        scanf("%s",x);        scanf("%s",y);        int ans = count(x, y);        printf("%d\n",ans);    }    return 0;}    


0 0
原创粉丝点击