1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int ans=0,i,j,ls,lp,next[10001]; 5 string s,p; 6 int main() 7 { 8 ios::sync_with_stdio(false); 9 //cin>>ls>>lp>>s>>p; 10 cin>>s>>p;ls=s.length();lp=p.length(); 11 i=0,j=-1; 12 next[0]=-1; 13 while(i<lp)//因为目标S中所含的几个模式P之间可能有重叠部分,所以还需要计算所有字符都匹配时的next 14 if(j<0||p[i]==p[j]) 15 { 16 i++;j++; 17 if(p[i]!=p[j]) next[i]=j;else next[i]=next[j]; 18 }else j=next[j]; 19 i=0,j=0; 20 while (i<ls) 21 { 22 if (j<0||s[i]==p[j]) {i++;j++;}else j=next[j]; 23 if (j==lp) {ans++;j=next[j];} 24 } 25 cout<<ans<<endl; 26 }
时间: 2024-10-12 11:32:57