#include <iostream>
using namespace std;
void fail(string & s, int f[]);
int fastFind(string &src,string &pat,int *fail);
/*
fail[i] = k (0<=k<i 且满足P[0]P[1]……P[k] = P[i-k]P[i-k+1]……P[i] 的最大整数)
= -1 (others)
*/
void fail(string & s, int f[])
{
int lengthP=s.length();
f[0]=-1;
for(int j=1;j<lengthP;j++)
{
int i=f[j-1]; // previous value
while(s[j] != s[i + 1] && i > -1)
{
i=f[i];
}
if(s[j]== s[i + 1])
f[j]=i+1;
else
f[j]=-1;
}
cout << endl;
}
int fastFind(string &src,string &pat,int *fail)
{
int posP=0,posT=0;
int lengthP=pat.length(),lengthT=src.length();
while(posP<lengthP && posT<lengthT)
{
if(pat.at(posP)==src.at(posT))
{
posP++;
posT++;//匹配成功一位就同时向后移一位
}
else if(posP==0)
{
posT++;//第一个字符都不匹配时,被匹配字符串向后移
}
else
{
posP=fail[posP-1]+1;//否则,通过失效函数找到重新匹配的起始位置
}
}
if(posP<lengthP)
{
return -1; // Not found
}
else
{
return posT - lengthP;//匹配成功时返回被匹配串中的匹配上的起始位置
}
}
int main( void )
{
string src = "aabbaabcaabb";
string t = "aabc";
int a[20];
fail(t, a);
int pos = fastFind(src, t, a);
cout << "pos = " << pos << endl;
for(int k = 0; k < t.length(); ++k)
{
cout << k << " : " << a[k] << endl;
}
}