题意:给俩字符串,问第一个字符串在第二个里面出现了几次。
解法: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; }