题目大意
题意:给T组数据,每组有两个字符串按顺序分别为模式串和母串。判断模式串在母串中出现的次数。模式串在母串中是可以相互覆盖的。
相互覆盖是什么意思呢? 比如模式串是ASA 母串ASASA 如果可以覆盖的话 那么AS"A"SA 我打引号的这个A就可以组成两个 反之就是一个了
思考
KMP模板,每次相同的时候ans++ 最后输出ans即可
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char t[1000005],p[10005]; int f[10005],ans; void getfail(char* p,int* f) { int m=strlen(p); f[0]=f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j&&p[j]!=p[i]) j=f[j]; f[i+1]=(p[i]==p[j])?j+1:0; } } void kmp(char* t,char* p,int* f) { int n=strlen(t),m=strlen(p); getfail(p,f); int j=0; for(int i=0;i<n;i++) { while(j&&p[j]!=t[i]) j=f[j]; if(p[j]==t[i]) j++; if(j==m) { ans++; } } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s%s",p,t); kmp(t,p,f); printf("%d\n",ans); ans=0; } return 0; }