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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <iomanip> #include <string> #include <map> #include <set> #include <algorithm> #include <queue> #include <vector> #define pb push_back #define mp make_pair using namespace std; typedef long long LL; typedef pair<int,int> PII; #define PI acos((double)-1) #define E exp(double(1)) #define K 1000000+9 #define rep(i,a,n) for(int i=a;i<n;i++) #define per(i,a,n) for(int i=n-1;i>=a;i--) #define ms(x,a) memset((x),(a),sizeof(a)) int nt[10006]; char a[K],b[10005]; int n,m;
void kmpGetNext(char *s,int *Next) { Next[0]=0; int len=strlen(s); for(int i=1,j=0;i<len;i++) { while(j&&s[i]!=s[j]) j=Next[j]; if(s[i]==s[j]) j++; Next[i+1]=j; } Next[len]=0; } int kmp(char *ss,char *s,int *Next) { kmpGetNext(s,Next);
int ans=0; int len1=strlen(ss); int len2=strlen(s); for(int i=0,j=0;i<len1;i++) { while(j&&ss[i]!=s[j])j=Next[j]; if(ss[i]==s[j]) j++; if(j==len2){ ans++;
} }
return ans; }
int main(void) {
int t; scanf("%d",&t); while(t--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); scanf("%s",a); scanf("%s",b); cout<< kmp(a,b,nt)<<endl; }
return 0; }
|