kmp的练习们
//poj3461 Oulipo //kmp模板 统计子串在母串中的位置 #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) { num++; j=next[j]; } } return num; } int main() { cin>>t; while(t--) { num=0; cin>>p>>s; l1=strlen(s); l2=strlen(p); cout<<kmp()<<endl; } }
//洛谷3375 字符串匹配 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int next[1000101]; string p,s; void get_next(string p) { next[0]=-1; int j=0; int k=-1; int l=p.length(); while(j<l) { if(k==-1||p[j]==p[k]) { j++; k++; next[j]=k; } else { k=next[k]; } } } void kmp(string s,string p) { get_next(p); int i=0,j=0; int l=s.length(); while(i<l) { if(j==-1||p[j]==s[i]) { i++; j++; } else { j=next[j]; } if(j==p.length()) { printf("%d\n",i-p.length()+1); j=0,i--; } } for(int a=1;a<=p.length();a++) { cout<<next[a]<<" "; } return; } int main() { cin>>s>>p; kmp(s,p); }
折花枝,恨花枝,准拟花开人共卮,开时人去时。
怕相思,已相思,轮到相思没处辞,眉间露一丝。