int n, m;
int S[maxn], T[maxm];
int Next[maxm];
//求 Next
void get_next()
{
int j = 0, k = -1;
Next[0] = -1;
while(j < m)
if(k == -1 || T[j] == T[k]) Next[++j] = ++k;
else k = Next[k];
}
//返回首次出现的位置
int KMP_index()
{
int i= 0, j= 0;
get_next();
while(i < n && j < m)
{
if(j == -1 || S[i] == T[j]) i ++, j ++;
else j = Next[j];
}
if(j == m) return i - m;
return -1;
}
//返回出现的次数
int KMP_count()
{
int res = 0;
if(n == 1 && m == 1)
if(S[0] == T[0]) return 1;
else return 0;
get_next();
for(int i= 0, j= 0; i< n; i ++)
{
while(j > 0 && S[i] != T[j]) j = Next[j];
if(S[i] == T[j]) j++;
if(j == m)
{
res++;
j = Next[j];
}
}
return res;
}
KMP模板
最新推荐文章于 2018-10-08 20:45:50 发布