一开始总是超时,后来发现还是方法没找对,这个跟普通KMP不太一样的就是,KMP匹配成功的时候会完全跳过已经匹配成功的匹配段,至少我掌握的是.那么如何避免这样的问题呢,举个栗子啊
原串为ABABA,模式串为ABA,当匹配成功的时候,只要跳转到模式串最大公共前后缀长度就行了,ABA的长度为1,所以就是从原串的第二个B开始进行匹配,这样就不会漏了,记录所有匹配成功的次数就是答案.
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char a[1000010],b[10010]; int Next[10010]; int get_next(const char *p) { Next[0] = 0; int lenp = strlen(p); for(int i = 1,k = 0;i < lenp;i++) { while(k > 0 && p[k] != p[i]) k = Next[k-1]; if(p[k] == p[i]) k++; Next[i] = k; } } int kmp(const char *t,const char *p) { int lent = strlen(t),lenp = strlen(p); get_next(p); int ans = 0; for(int i = 0,q = 0;i < lent;i++) { while(q > 0 && p[q] != t[i]) q = Next[q-1]; if(p[q] == t[i]) q++; if(q == lenp) { q = Next[q-1];///如上述 ans++; } } return ans; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s%s",b,a); printf("%d ",kmp(a,b)); } return 0; }