BF
#include<iostream>
#define MAXA 700
using namespace std;
typedef struct {
char ch[MAXA];
int length;
} str;
int bf(str s,str p);
int main(void) {
//模式串初始化
str s;
s.length=8;
s.ch[0]='a';
s.ch[1]='b';
s.ch[2]='a';
s.ch[3]='a';
s.ch[4]='b';//acabaabaabcacaabc
s.ch[5]='c';//abaabcac
s.ch[6]='a';
s.ch[7]='c';
//next的确定
//主串初始化
str t;
t.ch[0]='a';
t.ch[1]='c';
t.ch[2]='a';
t.ch[3]='b';
t.ch[4]='a';
t.ch[5]='a';
t.ch[6]='b';
t.ch[7]='a';
t.ch[8]='a';
t.ch[9]='b';
t.ch[10]='c';
t.ch[11]='a';
t.ch[12]='c';
t.ch[13]='a';
t.ch[14]='a';
t.ch[15]='b';
t.ch[16]='c';
t.length=17;
cout<<"//"<<bf(t,s);
return 0;
}
int bf(str s,str p){
int i=1,j=1;
while(i<=s.length && j<=p.length){
cout<<i<<","<<j<<endl;
if(s.ch[i-1]==p.ch[j-1]){
++i;++j;
}else{
i=i-j+2;
j=1;
}
}
if(j>p.length)return i-p.length;
else return 0;
}
KMP
#include<iostream>
#define MAXA 700
using namespace std;
typedef struct {
char ch[MAXA];
int length;
} str;
void getNext(str s,int next[]);
int KMP(str s,str t,int pos=1);
int main(void) {
//模式串初始化
str s;
s.length=8;
s.ch[0]='a';
s.ch[1]='b';
s.ch[2]='a';
s.ch[3]='a';
s.ch[4]='b';
s.ch[5]='c';
s.ch[6]='a';
s.ch[7]='c';
//next的确定
//主串初始化
str t;
t.ch[0]='a';
t.ch[1]='c';
t.ch[2]='a';
t.ch[3]='b';
t.ch[4]='a';
t.ch[5]='a';
t.ch[6]='b';
t.ch[7]='a';
t.ch[8]='a';
t.ch[9]='b';
t.ch[10]='c';
t.ch[11]='a';
t.ch[12]='c';
t.ch[13]='a';
t.ch[14]='a';
t.ch[15]='b';
t.ch[16]='c';
t.length=17;
cout<<"//"<<KMP(t,s);
return 0;
}
void getNext(str s,int next[]) {
int i=1;
int j=0;
next[i]=j;
while(i<=s.length) {
if(j==0 || s.ch[i-1]==s.ch[j-1]) {
i++;
j++;
next[i]=j;
} else {
j=next[j];
}
}
for(i=1; i<=8; i++) {
cout<<next[i]<<endl;
}
}
void getNextval(str s,int nextval[]) {
int i=1;
int j=0;
nextval[i]=j;
while(i<=s.length) {
if(j==0 || s.ch[i-1]==s.ch[j-1]) {
i++;
j++;
if(s.ch[i]!=s.ch[j])nextval[i]=j;
else nextval[i]=nextval[j];
} else {
j=nextval[j];
}
}
for(i=1; i<=8; i++) {
cout<<nextval[i]<<endl;
}
}
int KMP(str s,str t,int pos) {
int next[t.length+1];
getNext(t,next);
int i=pos;
int j=1;
while(i<=s.length && j<=t.length) {
if(j==0 || s.ch[i-1]==t.ch[j-1]) {
++i;++j;
} else {
j=next[j];
}
}
if(j>t.length)return(i-t.length);
else return 0;
}