Appearance
Border 指:字符串的公共前后缀。
根据情境的不同,Border 可以指字符串、字符串的长度,也可以指最长的字符串、最长的字符串长度,Border 可以是其本身,也可以不含其本身。具体含义需要结合场景分析。
周期和循环节:
对于字符串
若
Border vs 周期:
所以求 Border 和求周期等价,求最小周期即为求最大 Border。
所有前缀的 Border 的求法:
Border 具有传递性:
所以
cpp
void init(string &a) { // 出于方便,考虑 border 的字符串一般下标从 1 开始
int j = 0, n = a.size() - 1;
for (int i = 2; i <= n; i++) {
while (j && a[i] != a[j + 1])
j = border[j];
if (a[i] == a[j + 1])
j++;
border[i] = j;
}
}
