/**********************************************************************************************/
//KMP C++ version
//FILE: KMP.h
//AUTHOR: shenan
//DATE: 2008.12.25
#ifndef _TEMPLATE_KMP_H_
#define _TEMPLATE_KMP_H_
template<class T>
void get_next(T sub, int next[])
{
int i = 0, j = -1, lenSub = strlen(sub);
next[0] = -1;
while( i < lenSub )
{
if( j == -1 || sub[i] == sub[j] )
{ ++i; ++j; next[i] = j; }
else
j = next[j];
}
}
template<class T>
void get_nextval(T sub, int next[])
{
int i = 0, j = -1, lenSub = strlen(sub);
next[0] = -1;
while( i < lenSub )
{
if( j == -1 || sub[i] == sub[j] )
{
++i; ++j;
if( sub[i] != sub[j] )
next[i] = j;
else
next[i] = next[j];
}
else
j = next[j];
}
}
template<class T>
int KMP(T src, T sub, int next[], int pos)
{
int i = pos, j = 0;
int lenSrc = strlen(src);
int lenSub = strlen(sub);
while( i < lenSrc && j < lenSub )
{
if( j == -1 || src[i] == sub[j] )
{ ++i; ++j; }
else
j = next[j];
}
if( j >= lenSub )
return i - lenSub;
else
return -1;
}
#endif
//FILE: test.cpp
//AUTHOR: shenan
//DATE: 2008.12.25
#include <iostream>
#include <string>
using namespace std;
#include "KMP.h"
int main()
{
char * src = "acabaabaabcaaaabc";
char * sub = "aaaab";//"abaabcac";
int lenSub = strlen(sub);
int * next = new int(lenSub);
get_next(sub, next);
get_nextval(sub, next);
int n = KMP(src, sub, next, 0);
char *p = src+n;
cout<<p<<endl;
delete[]next;
return 0;
}
/**********************************************************************************************/
//KMP C version
//FILE: KMP.c
//AUTHOR: nshe
//DATE: 2009.01.03
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_next(char * sub, int next[])
{
int i = 0, j = -1, len = strlen(sub);
next[0] = -1;
while( i < len )
{
if( j == -1 || sub[i] == sub[j])
{ ++i; ++j; next[i] = j; }
else
j = next[j];
}
}
void get_nextval(char * sub, int nextval[])
{
int i = 0, j = -1, len = strlen(sub);
nextval[0] = -1;
while( i < len )
{
if( j == -1 || sub[i] == sub[j])
{
++i; ++j;
if( sub[i] != sub[j] )
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}
int KMP( char * src, char * sub, int next[], int pos )
{
int i = pos, j = 0;
int lenSrc = strlen(src);
int lenSub = strlen(sub);
while( i < lenSrc && j < lenSub )
{
if( j == -1 || src[i] == sub[j] )
{ ++i; ++j; }
else
j = next[j];
}
if(j >= lenSub)
return i - lenSub;
return -1;
}
int main()
{
char * src = "acabaabaabcaaaabc";
char * sub = "aaaab";//"abaabcac";
int n1,n2;
char *p1, *p2;
int lenSub = strlen(sub);
int * next = (int*)malloc(lenSub);
int * nextval = (int*)malloc(lenSub);
get_next(sub, next);
get_nextval(sub, nextval);
n1 = KMP(src, sub, next, 0);
n2 = KMP(src, sub, nextval, 0);
p1 = src+n1;
printf("n1=%d, substr=%s/r/n", n1, p1);
p2 = src+n2;
printf("n1=%d, substr=%s/r/n", n2, p2);
free(next);
free(nextval);
return 0;
}