This documentation is automatically generated by online-judge-tools/verification-helper
文字列を Lyndon word の非増加列に一意に分解する。 Duval algorithm により $O(|s|)$。
vector<pair<int, int>> lyndon_factorization(const string& s)
各因子の半開区間 [l, r) を順に返す。空文字列なら空 vector を返す返り値の各区間を s.substr(l, r - l) として取り出せる。
auto segs = lyndon_factorization(s);
for (auto &&[l, r] : segs) {
string t = s.substr(l, r - l);
}
using namespace std;
vector<pair<int, int>> lyndon_factorization(const string &s) {
int n = (int)s.size();
vector<pair<int, int>> res;
for (int i = 0; i < n;) {
int j = i + 1, k = i;
while (j < n && s[k] <= s[j]) {
if (s[k] < s[j]) k = i;
else ++k;
++j;
}
int len = j - k;
while (i <= k) {
res.emplace_back(i, i + len);
i += len;
}
}
return res;
}
/**
* @brief Lyndon分解(Lyndon Factorization)
*/#line 1 "string/lyndon_factorization.cpp"
using namespace std;
vector<pair<int, int>> lyndon_factorization(const string &s) {
int n = (int)s.size();
vector<pair<int, int>> res;
for (int i = 0; i < n;) {
int j = i + 1, k = i;
while (j < n && s[k] <= s[j]) {
if (s[k] < s[j]) k = i;
else ++k;
++j;
}
int len = j - k;
while (i <= k) {
res.emplace_back(i, i + len);
i += len;
}
}
return res;
}
/**
* @brief Lyndon分解(Lyndon Factorization)
*/