最小表示法

找到所有与字符串 \(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);
        }

}
posted @ 2025-03-17 20:23  Hstry  阅读(2)  评论(0)    收藏  举报