/kel 字符串萌新求问
查看原帖
/kel 字符串萌新求问
137603
zhiyangfanshotacon楼主2021/11/17 08:55

真是从零开始 kmp 了...

众所周知这道题 dp\rm 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,rpi_{l,r} 表示 Sl..rS_{l..r} 这段的 π\pi 数组,也就是前缀数组。具体求法:

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;
	}
}

显然这里我们需要跳转的是匹配到的前缀那一段的 π\pi,但是如果我把跳的部分换成:

v = pi[i][v];

也是能 AC 的。我想的不是很通qwq

显然当 i1i\ne 1 的时候这俩对应的地方完全不一样吧qwq

2021/11/17 08:55
加载中...