真是从零开始 kmp 了...
众所周知这道题 dp 转移的时候需要不断找周期长度,也就是这个部分:
while (v)
{
if (l % (l - v) == 0) f[i][j] = std::min(f[i][j], f[i][i + l - v - 1]);
v = pi[i][i + v - 1];
}
然后我的 pil,r 表示 Sl..r 这段的 π 数组,也就是前缀数组。具体求法:
for (int l = 1; l <= n; ++l)
{
int j = 0;
for (int r = l + 1; r <= n; ++r)
{
while (j && s[l + j] != s[r]) j = pi[l][j];
if (s[l + j] == s[r]) ++j; pi[l][r] = j;
}
}
显然这里我们需要跳转的是匹配到的前缀那一段的 π,但是如果我把跳的部分换成:
v = pi[i][v];
也是能 AC 的。我想的不是很通qwq
显然当 i=1 的时候这俩对应的地方完全不一样吧qwq