#include <stdio.h>
#include <string.h>
#define PATLEN 10
struct pat {
char pats[PATLEN];
int f[PATLEN];
};
void fail(struct pat *pt)
{
int i;
int j;
int len ;
char *ch;
len = strlen(pt->pats);
ch = &pt->pats[0];
pt->f[0] = -1;
for (j = 1; j < len; j++) {
i = pt->f[j-1];
while (*(ch+j) != *(ch+i+1) && i >= 0)
i = pt->f[i];
if (*(ch+j) == *(ch+i+1)) pt->f[j] = i + 1;
else pt->f[j] = -1;
}
}
int fastfind(char *s, struct pat *p)
{
int posP = 0, posT = 0;
int lengthP = strlen(p->pats), lengthT = strlen(s);
while (posP < lengthP && posT < lengthT)
if (p->pats[posP] == s[posT]) {
posP++; posT++;
}
else if (posP == 0) posT++;
else
posP = p->f[posP-1] + 1;
if (posP < lengthP) return -1;
else
return posT - lengthP;
}
int main()
{
struct pat pt = {"aba"};
fail(&pt);
printf("pos: %d/n", fastfind("bcabcabadedad", &pt));
return 0;
}