#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void get_next(string T,int *next);
int Index_KMP(string s,string T,int pos);
void get_nextval(string T,int *nextval);
void get_next(string T,int *next)
{
int i=1;
int j;
j=0;
next[1]=0;
while (i<T.length())
{
if(j==0 ||T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
int Index_KMP(string s,string T,int pos)
{
int i=pos;
int j=1;
int next[255];
get_nextval(T,next);
int cout=T.length();
while(i<s.length()&&j<cout)
{
if(j==0||s[i]==T[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>T.length()-1)
return i-T.length()+1;
else
return 0;
}
void get_nextval(string T,int *nextval) //改进算法
{
int i=1;
int j;
j=0;
nextval[1]=0;
while (i<T.length())
{
if(j==0 ||T[i]==T[j])
{
++i;
++j;
if(T[i]!=T[j])
{
nextval[i]=j;
}
else
{
nextval[i]=nextval[j];
}
}
else
j=nextval[j];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string str="aaaabcde";
string str1 ="aaaaax";
int k=str.length();
int state=Index_KMP(str,str1,1);
cout<<k<<endl;
cout<<state<<endl;
while(1);
return 0;
}
#include <iostream>
#include <string>
using namespace std;
void get_next(string T,int *next);
int Index_KMP(string s,string T,int pos);
void get_nextval(string T,int *nextval);
void get_next(string T,int *next)
{
int i=1;
int j;
j=0;
next[1]=0;
while (i<T.length())
{
if(j==0 ||T[i]==T[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
int Index_KMP(string s,string T,int pos)
{
int i=pos;
int j=1;
int next[255];
get_nextval(T,next);
int cout=T.length();
while(i<s.length()&&j<cout)
{
if(j==0||s[i]==T[j])
{
++i;
++j;
}
else
{
j=next[j];
}
}
if(j>T.length()-1)
return i-T.length()+1;
else
return 0;
}
void get_nextval(string T,int *nextval) //改进算法
{
int i=1;
int j;
j=0;
nextval[1]=0;
while (i<T.length())
{
if(j==0 ||T[i]==T[j])
{
++i;
++j;
if(T[i]!=T[j])
{
nextval[i]=j;
}
else
{
nextval[i]=nextval[j];
}
}
else
j=nextval[j];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string str="aaaabcde";
string str1 ="aaaaax";
int k=str.length();
int state=Index_KMP(str,str1,1);
cout<<k<<endl;
cout<<state<<endl;
while(1);
return 0;
}