char t[N], s[N];
int nxt[N], extend[N];
int tlen, slen;
void getnxt()
{
nxt[0] = tlen;
int now = 0;
while (t[now] == t[now + 1] && now + 1 < tlen) now++;
nxt[1] = now;
int p0 = 1;
for (int i = 2; i < tlen; i++)
{
if (i + nxt[i - p0] < nxt[p0] + p0)nxt[i] = nxt[i - p0];
else
{
int now = nxt[p0] + p0 - i;
now = max(now, 0);
while (t[now] == t[i + now] && i + now < tlen)now++;
nxt[i] = now;
p0 = i;
}
}
}
void exkmp()
{
getnxt();
int now = 0;
while (s[now] == t[now] && now < min(slen, tlen))now++;
extend[0] = now;
int p0 = 0;
for (int i = 1; i < slen; i++)
{
if (i + nxt[i - p0] < extend[p0] + p0) extend[i] = nxt[i - p0];
//(i-1)+nxt[i-p0](i对应的t的nxt数组) < extend[p0]+p0-1 nxt数组下标从零开始
else
{
int now = extend[p0] + p0 - i;//(extend[p0]+p0-1)-(i-1)
now = max(now, 0);
while (t[now] == s[i + now] && now < tlen && i + now < slen)now++;
//t[now] t数组下标0开始 s[i+now]=s[(i-1)+now+1]
extend[i] = now;
p0 = i;
}
}
}
扩展kmp算法
最新推荐文章于 2023-08-17 12:02:50 发布