1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 const int size=1000020,p=131; 6 typedef unsigned long long ULL; 7 ULL f[size],key[size]; 8 int T; 9 char tmp1[size],tmp2[size]; 10 int main(){ 11 f[0]=1; 12 for(int i=1;i<=size;++i) f[i]=f[i-1]*p; 13 scanf("%d",&T); 14 while(T--){ 15 scanf("%s%s",tmp1+1,tmp2+1); 16 int len1=strlen(tmp1+1),len2=strlen(tmp2+1); 17 for(int i=1;i<=len2;++i) key[i]=key[i-1]*p+(ULL)(tmp2[i]); 18 ULL key_tmp1=0;int ans=0; 19 for(int i=1;i<=len1;++i) key_tmp1=key_tmp1*p+(ULL)tmp1[i]; 20 for(int i=0;i<=len2-len1;++i) if(key[i+len1]-key[i]*f[len1]==key_tmp1) ++ans; 21 printf("%d ",ans); 22 } 23 return 0; 24 }
1 //KMP 2 #include<iostream> 3 #include<cstdio> 4 #include<stack> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 using namespace std; 9 const int size=1000005; 10 char a[size],b[size]; 11 int Nex[size],lena,lenb,T,ans; 12 void init(char *s){ 13 for(int i=2,j=0;i<=lenb;++i){ 14 while(j>0&&s[j+1]!=s[i]) j=Nex[j]; 15 if(s[j+1]==s[i]) ++j; 16 Nex[i]=j; 17 } 18 } 19 void kmp(char *a,char *b){ 20 memset(Nex,0,sizeof(Nex)); 21 init(b); 22 for(int i=1,j=0;a[i];++i){ 23 while(j&&a[i]!=b[j+1]) j=Nex[j]; 24 if(a[i]==b[j+1]) ++j; 25 if(j==lenb) ++ans,j=Nex[j]; 26 } 27 } 28 int main(){ 29 scanf("%d",&T); 30 while(T--){ 31 ans=0; 32 scanf("%s%s",b+1,a+1); 33 lena=strlen(a+1),lenb=strlen(b+1); 34 kmp(a,b); 35 printf("%d ",ans); 36 } 37 return 0; 38 }