Lydon分解板子

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 2e6 + 10;
struct node {
    char s[maxn];
    int Lyndon_end[maxn];
    int coun;
    void get_Lyndon() {
        coun = 0;
        int N = strlen(s), j, k;
        for (int i = 0; i < N;) {
            j = i;
            k = i + 1;
            while (k <= N && s[j] <= s[k]) {
                if (s[j] < s[k])
                    j = i;
                else
                    j++;
                k++;
            }
            while (i <= j) {
                Lyndon_end[coun++] = i + k - j - 1;
                i += k - j;
            }
        }
    }
};

int main() {
    node Ly;
    scanf("%s", Ly.s);
    Ly.get_Lyndon();
    for (int i = 0; i < Ly.coun; i++) cout << Ly.Lyndon_end[i] + 1 << " ";

    return 0;
}
原文地址:https://www.cnblogs.com/King-of-Dark/p/13530455.html