abcde a3 aaaaaa aa #
0 3
要求主串中不重叠的包含模式串的次数。可用KMP算法统计,注意与可以重叠的区别。
1.可以重叠时if(j==wslen)j=next[j]
2.不可重叠时if(j==wslen)j=0
由于数据比较小,可以直接用库函数strstr做。
用库函数strstr解题
#include<iostream> #include<cstdio> #include<cstring> const int MAXN=1000+1000; char W[MAXN],T[MAXN];//W为模式串,T为主串 int main() { int i,ans; while(~scanf("%s",T)) { if(strcmp(T,"#")==0) break; scanf("%s",W); ans=0; int wlen=strlen(W); char *start=T,*pos; while((pos=strstr(start,W))!=NULL) { start=pos+wlen; ans++; } printf("%d\n",ans); } return 0; }
KMP算法解题
#include<iostream> #include<cstdio> #include<cstring> const int MAXN=1000+1000; char W[MAXN],T[MAXN];//W为模式串,T为主串 int next[MAXN]; //KMP算法中计算next[]数组 void getNext(char *p) { int j,k,len=strlen(p); j=0; k=-1; next[0]=-1; while(j<len) { if(k==-1||p[j]==p[k]) { next[++j]=++k; } else k=next[k]; } } //KMP算法统计模式串W在主串T中出现的次数 int KMP_count(char *W,char *T) { int i,wlen=strlen(W),tlen=strlen(T),j=0,ans=0; //memset(next,0,sizeof(next)); getNext(W); for(i=0;i<tlen;i++) { while(j>0&&T[i]!=W[j]) j=next[j]; if(W[j]==T[i]) j++; if(j==wlen) { ans++; j=0; } } return ans; } int main() { while(~scanf("%s",T)) { if(strcmp(T,"#")==0) break; scanf("%s",W); //change(W1,W); //change(T1,T); printf("%d\n",KMP_count(W,T)); } return 0; }