/*
aacaaabaaaacaaaa
aaaab
35 25 17
*/
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int next[999999];
int nextval[999999];
int cnt=0;
void fn(int a,int b){//求next数组
if(s2[a]==s2[b])
next[a+1]=b+1;
else{
b=next[b];
if(b!=0){
fn(a,b);
}
else
next[a+1]=1;
}
}
int main(){
int n1,n2,i,j,k;
int flag=0;
string ss1 ,ss2 ;
cin>>ss1>>ss2;
s1="x"+ss1;
s2="x"+ss2;
n2=s2.size()-1;
n1=s1.size()-1;
next[1]=0;
next[2]=1;
for(j=3;j<=n2;j++){
k=next[j-1];
fn(j-1,k);
}
cout<<"next :";
for(i=1;i<=n2;i++)
cout<<next[i]<<" ";
cout<<endl;
nextval[1]=0;
for(j=2;j<=n2;j++){
if(s2[j]==s2[next[j]])
nextval[j]=nextval[next[j]];
else
nextval[j]=next[j];
}
cout<<"nextval:";
for(i=1;i<=n2;i++)
cout<<next[i]<<" ";
cout<<endl<<endl;
//用暴力
flag =0;cnt=0;
i=1;j=1;
while(i<=n1&& j<=n2){
cnt++;
if(s1[i] == s2[j]){
i++;j++;
}
else
{
i = i-j+2; j = 1;
}
}
if(i>n1&&j<=n2)
cout<<"not found\n";
cout<<"BF = "<<cnt<<endl<<endl;
//用next
cnt=0;
for(i=1;i<=n1;){
for(j=1;j<=n2;){
if(s1[i]==s2[j]){
i++;j++;
cnt++;
}
else{
if(j!=1){
j=next[j];
if(j==0)
j=1;
}
else
i++;
cnt++;
}
if(j>n2) {
flag=1;
break;
}
if(i>n1)break;
}
if(flag)break;
}
if(i>n1&&j<=n2)
cout<<"not found\n";
cout<<"KMP1 = "<<cnt<<endl<<endl;
//用nextval
flag =0;cnt=0;
for(i=1;i<=n1;){
for(j=1;j<=n2;){
if(s1[i]==s2[j]){
i++;j++;
cnt++;
}
else{
j=nextval[j];
if(j==0){
i++;j++;
}
cnt++;
}
if(j>n2) {
flag=1;
break;
}
if(i>n1) break;
}
if(flag)break;
}
if(i>n1&&j<=n2)
cout<<"not found\n";
cout<<"KMP2 = "<<cnt<<endl;
return 0;
}
4模式串的匹配KMP
最新推荐文章于 2023-09-16 06:00:00 发布