思路:KMP算法……慢慢来,把KMP吃透了……
#include <iostream> #include <map> #include <string> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; char str[1000005],str1[10005]; int next[10005],len,len1,p=1; void getnext() { int k=-1,j=0; next[0]=-1; while(j<len1) { if(k==-1||str1[j]==str1[k]) { j++; k++; if(str1[j]!=str1[k]) next[j]=k; else next[j]=next[k]; } else k=next[k]; } } void kmp() { int i=0,j=0,k=0; while(i<len) { if(str1[j]==str[i]) { i++; j++; } else { j=next[j]; if(j==-1) { i++; j=0; } } if(j==len1) {printf("%d ",i-len1);p=0;} } } int main() { scanf("%s%s",str,str1); len=strlen(str); len1=strlen(str1); getnext(); kmp(); if(p) printf("-1\n"); else printf("\n"); return 0; }
POJ 3461
方法与上题相同……
#include <iostream> #include <map> #include <string> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; char str[1000005],str1[10005]; int next[10005],len,len1,sum; void getnext() { int k=-1,j=0; next[0]=-1; while(j<len1) { if(k==-1||str1[j]==str1[k]) { j++; k++; if(str1[j]!=str1[k]) next[j]=k; else next[j]=next[k]; } else k=next[k]; } } void kmp() { int i=0,j=0,k=0; while(i<len) { if(str1[j]==str[i]) { i++; j++; } else { j=next[j]; if(j==-1) { i++; j=0; } } if(j==len1) sum++; } } int main() { int t; cin>>t; while(t--) { sum=0; scanf("%s%s",str1,str); len=strlen(str); len1=strlen(str1); getnext(); kmp(); cout<<sum<<endl; } return 0; }