最小表示法模板

auto getMin = [](vector<int> &v)->vector<int> {
    int n = v.size();
    int k = 0, i = 0, j = 1;
    while (k < n && i < n && j < n) {
        if (v[(i + k) % n] == v[(j + k) % n]) {
            k++;
        } else {
            v[(i + k) % n] > v[(j + k) % n] ? i = i + k + 1 : j = j + k + 1;
            if (i == j) i++;
            k = 0;
        }
    }
    i = min(i, j);

    vector<int> res(n);
    for (int x = i; x < n; x += 1) {
        res[x - i] = v[x];
    }
    for (int x = 0; x < i; x += 1) {
        res[x + n - i] = v[x];
    }
    return res;
};
posted @ 2025-06-05 16:39  Ke_scholar  阅读(13)  评论(0)    收藏  举报