题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=5
暴力:
#include <stdio.h> #include <string.h> char a[15]; char b[1005]; int len1,len2; int main() { int t; scanf("%d",&t); while(t--) { int i,j; int Count=0; scanf("%s%s",a,b); len1=strlen(a); len2=strlen(b); for(i=0;i<len2-len1+1;i++) { for(j=0;j<len1;j++) { if(a[j]!=b[i+j]) break; } if(j==len1) Count++; } printf("%d ",Count); } return 0; }
STL:
///STL #include <iostream> #include <cstdio> #include <string> #include <algorithm> using namespace std; int main() { int t; cin>>t; while(t--) { string p,s; cin>>p>>s; int ans=0; int num=0; ans=s.find(p,0); while(ans!=string::npos) { num++; ans=s.find(p,ans+1); } printf("%d ",num); } return 0; }
KMP
///KMP #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; char p[1005],s[1005]; int next[1005]; void getnext()///对齐p[j] { int i=0,j=-1,len=strlen(p); next[0]=-1; while(i<len-1) { if(j==-1||p[i]==p[j])///如果p[i]和p[j]相等,next[i]就等于j,这样在调用next[i]时j(调用时的j)就直接到p[j]的位置了。 { j++; i++; next[i]=j; } else j=next[j];///p[i]和p[j]不相等时,p[j]就从新对齐。同理p和s的比较。 } } int kmp() { int i=-1,j=-1,lenp=strlen(p),lens=strlen(s); getnext(); int num=0; while(i<lens) { if(j==-1||s[i]==p[j])///s[i]和p[j]相等就往后面走 { ++i; ++j; } else j=next[j];///s[i]和p[j]不相等就要从新对齐p[j], if(j==lenp) { i=i-j; j=-1; num++; } } return num; } int main() { int n; scanf("%d",&n); while(n--) { scanf("%s%s",p,s); printf("%d ",kmp()); } }