最小表示法
找到所有与字符串 \(S\) 循环同构的字符串中字典序最小的一个
可以使用后缀排序做到 \(O(n\log n)\) 或 \(O(n)\),但是该问题存在实现简单的 \(O(n)\) 算法
模板
namespace string_algo {
template <typename iter_t, ass_is_RAI(iter_t)>
iter_t minimal_string(iter_t bg, iter_t ed){
if (bg == ed)return bg;
iter_t i = bg, j = bg + 1;
while (i != ed && j != ed){
if (i > j)swap(i, j);
size_t k = 0;
while (j + k != ed && *(i + k) == *(j + k))++k;
if (j + k == ed)break;
if (*(i + k) < *(j + k))j += k + 1;
else i += k + 1;
if (i == j)++j;
}
return std::min(i, j);
}
}

浙公网安备 33010602011771号