计算串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; }
poj3461 Oulipo(Kmp),布布扣,bubuko.com
原文:http://blog.csdn.net/yew1eb/article/details/20637063