/* 2016年4月28日10:27:36 kmp 注意重复的也算 p:AZA t:AZAZAZA ans = 3; */ #include #include const int maxn = 1e6 + 5; char p[10005]; int next[10005]; char t[maxn]; void makenext() { int m = strlen(p); next[0] = 0; for(int q = 1,k = 0;q < m;q++) { while(k > 0 && p[q] != p[k]) k = next[k-1]; //跳到上一个前缀 if(p[q] == p[k]) k++; next[q] = k; } } int kmp() { int ans = 0; int m = strlen(p); int n = strlen(t); for(int i = 0,q = 0;i < n;i++) { while(q > 0 && p[q] != t[i]) q = next[q-1]; if(p[q] == t[i]) q++; if(q == m) { ans++; q = next[q-1]; //如果重复的不算的话,q = 0;和上面的k = next[k-1];比较看一下 } } return ans; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",p); scanf("%s",t); makenext(); printf("%d\n",kmp()); } return 0; } /* 3 BAPC BAPC AZA AZAZAZA VERDI AVERDXIVYERDIAN 1 3 0 */