1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| #include <cstdio> #include <cstring>
#define MAXN 1000100
char a[MAXN],b[MAXN]; int f[MAXN]; int n,m; int cnt;
void getFail() { f[0] = 0; for (int i = 1; i<m; i++) { int j = f[i-1]; while (j && b[i]!=b[j]) j = f[j-1]; f[i] = b[i]==b[j]?j+1:0; }
return; }
void find() { int j = 0; for (int i = 0; i<n; i++) { while (a[i]!=b[j] && j) j = f[j-1]; if (a[i]==b[j]) j++; if (j==m) cnt ++; } }
int main() { int T; scanf("%d",&T); while (T--) { cnt = 0; scanf("%s",b); scanf("%s",a);
n = strlen(a);
m = strlen(b);
getFail();
find();
printf("%d\n",cnt); } }
|