每日模板一練(KMP)
阿新 • • 發佈:2018-12-14
大意:
給出兩個字串s1,s2,求s1中包含多少不重疊的子串=s2
樣例:
aaaaaa aa
abcde a2
輸出:
3
0
#include<bits/stdc++.h> using namespace std; const int MAXN=1001; int nxt[MAXN]; string s1,s2; void make_next(string s) { for(int i=1,j=0;i<s.length();++i) { while(j&&s[i]!=s[j]) j=nxt[j-1]; if(s[i]==s[j]) ++j; nxt[i]=j; } } int kmp(string s1,string s2) { int f=0,sum=0; for(int i=0,j=0;i<s1.length();++i) { while(j&&s1[i]!=s2[j]) j=nxt[j-1]; if(s1[i]==s2[j]) ++j; if(j==s2.length()) { sum++; j=0; } } return sum; } int main() { while(cin>>s1&&s1!="#") { cin>>s2; make_next(s2); cout<<kmp(s1,s2)<<endl; } return 0; }