poj3461
/*输出所有出现的位置、出现次数 */ #include<iostream> #include<cstring> using namespace std; string s,t; int ans; int next[100000]; int slen,tlen; int main() { cin>>s>>t; slen=s.length(),tlen=t.length(); int j,k;j=0,k=-1; next[0]=-1; while(j<tlen) { if(k==-1||t[j]==t[k]) { k++,j++; next[j]=k; } else k=next[k]; } int i; j=0,i=0; while(i<slen) { if(j==-1||s[i]==t[j])i++,j++; else j=next[j]; if(j==tlen) { cout<<i-tlen<<' '; ans++; } } cout<<endl<<ans; return 0; }
/*另一种,在别人的代码中看见的,然而并不能看懂。。。难以理解,不举荐*/ #include <iostream> #include <cstring> using namespace std; const int N = 1000002; int next[N]; char S[N], T[N]; int slen, tlen; void getNext() { int j, k; j = 0; k = -1; next[0] = -1; while(j < tlen) if(k == -1 || T[j] == T[k]) next[++j] = ++k; else k = next[k]; } /* 返回模式串T在主串S中首次出现的位置 返回的位置是从0开始的。 */ int KMP_Index() { int i = 0, j = 0; getNext(); while(i < slen && j < tlen) { if(j == -1 || S[i] == T[j]) { i++; j++; } else j = next[j]; } if(j == tlen) return i - tlen; else return -1; } /* 返回模式串在主串S中出现的次数 */ int KMP_Count() { int ans = 0; int i, j = 0; if(slen == 1 && tlen == 1) { if(S[0] == T[0]) return 1; else return 0; } getNext(); for(i = 0; i < slen; i++) { while(j > 0 && S[i] != T[j]) j = next[j]; if(S[i] == T[j]) j++; if(j == tlen) { ans++; j = next[j]; } } return ans; } int main() { int TT; int i, cc; cin>>TT; while(TT--) { cin>>T>>S; slen = strlen(S); tlen = strlen(T); cout<<"模式串T在主串S中首次出现的位置是: "<<KMP_Index()<<endl; cout<<"模式串T在主串S中出现的次数为: "<<KMP_Count()<<endl; } return 0; }
洛谷 kmp字符串匹配
/*lrh*/ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int next[100010]; char p[10010],s[1000010]; int t,num,l1,l2; void get_next() { int j=0; int k=-1; next[0]=-1; while(j<l2) { if(k==-1||p[k]==p[j]) { k++; j++; next[j]=k; } else { k=next[k]; } } } int kmp() { int i=0; int j=0; get_next(); while(i<l1) { if(j==-1||p[j]==s[i]) { j++; i++; } else { j=next[j]; } if(j==l2) { cout<<i-l2+1<<endl; j=next[j]; } } } int main() { t=1; while(t--) { num=0; cin>>s>>p; l1=strlen(s); l2=strlen(p); get_next(); kmp(); for(int i=1;i<=l2;i++)cout<<next[i]<<' '; } } /*myl*/ #include<iostream> #include<cstring> using namespace std; string s,t; //int ans; int next[100000]; int slen,tlen; int main() { cin>>s>>t; slen=s.length(),tlen=t.length(); int j,k;j=0,k=-1; next[0]=-1; while(j<tlen) { if(k==-1||t[j]==t[k]) { k++,j++; next[j]=k; } else k=next[k]; } int i; j=0,i=0; while(i<slen) { if(j==-1||s[i]==t[j])i++,j++; else j=next[j]; if(j==tlen) { cout<<i-tlen+1<<endl; j=next[j]; //ans++; } } for(int i=1;i<=tlen;i++) cout<<next[i]<<' '; return 0; }