#include <iostream> #include <cstdio> #include <string> using namespace std; int next(string str1,int k) { int i=0; int j=1; int n=0; while(j<k) { if(str1[i]==str1[j]) { ++n; ++i; ++j; } else { ++j; i=0; n=0; } } if(k==0){//这个强制定义的也一定要加上,一定不能落条件 return -1; }else{ return n; } } int main() { int fre; string str1; string str2; scanf("%d",&fre); for(int i=0; i<fre; ++i) { // getline(cin,str1); // getline(cin,str2); cin>>str1>>str2; int m=str1.size(); int n=str2.size(); int j=0; int k=0; int p=0; while(k<n)//这个用while,不用for { if(str1[j]==str2[k])//相等就一次往后加 { ++j; ++k; } else//不相等,让k跳到数组哪里,j先不动 { j=next(str1,j); // k=next[k]; if(j==-1)//如果在模式串第一个字母就不对,那么两个都往后+1,这个时候,k=0,正好+1,变成了1 { ++j; ++k; } } if(j==m&&str1[j-1]==str2[k-1]) //你就要想好,匹配上的条件是什么! { ++p; // printf("%d\n",k-m);//这种最难确定了,一会再改 } } // for(int i=1;i<=n;++i){ // printf("%d ",next(b,i)); // } // printf("\n"); //成功出来之后,k=n+1,并且a[j-1]==b[k-1] // if(j==m&&str1[j-1]==str2[k-1]) //你就要想好,匹配上的条件是什么! // { // printf("%d\n",k-m);//这种最难确定了,一会再改 // } // else // { // printf("%d\n",j); // printf("%d\n",n); printf("%d\n",p); // } } }