标签:
题意:给出一个串,求另一个串中有多少个这个串
KMP,根据next数组特性解题。
#include<cstdio> #include<cstring> using namespace std; int Next[10000+5]; //str1是长的,str2是短的 char str1[1000000+5],str2[10000+5]; int cnt; void getNext(int len2) { int i=0,j=-1; Next[0]=-1; while(i<len2) { if (j==-1||str2[i]==str1[j]) { i++,j++; if (str2[i]!=str2[j]) Next[i]=j; else Next[i]=Next[j]; } else { //这是j=Next[j] 数组下标是j j=Next[j]; } } } int kmp(int len1,int len2) { int i=0,j=0; getNext(len2); while(i<len1) { if (j==-1||str1[i]==str2[j]) { i++,j++; } else { j=Next[j]; } if (j==len2) { cnt++; //初始化也是j=Next[j] 而不是j=0 j=Next[j]; } } } int main() { #ifndef ONLINE_JUDGE freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin); // freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout); #endif int n; int len1,len2; scanf("%d%*c",&n); while(n--) { gets(str2); gets(str1); len1=strlen(str1); len2=strlen(str2); cnt=0; kmp(len1,len2); printf("%d\n",cnt); } return 0; }
标签:
原文地址:http://www.cnblogs.com/s1124yy/p/5661311.html