好像(dfs O(n))暴力可以毫无压力的轻松过,
当然你要写( ext{SA})也没人拦你。
如果两个字符相同我们可以发现是一样的,于是用一个(a)数组把这个东西压起来。
如果(s_i > s_{i + 1}) 那么就删除(s_i) ,
如果(s_i < s_{i + 1}) 那么就删除(s_{i + 1})
然后一次(dfs)就解决了。
#include <bits/stdc++.h>
const int maxn = 1e6 + 10;
int n, m, i, j, k, tot;
int a[maxn];
char s[maxn];
void dfs(int u) {
int p = u;
for(;s[ a[p] ] > s[ a[p + 1] ];p++) {
for(int j = a[p] ;j < a[p + 1];j++)
printf("%d ",j);
if(a[p + 1] == n + 1)
return;
}
dfs(p + 1);
for(int j = a[p];j < a[p + 1];j++)
printf("%d ",j);
}
int main() {
scanf("%d
%s",&n,s + 1);
s[0] = 'A';
for(int i = 1;i <= n;i++) {
if(s[i] == s[i - 1])
continue;
a[++tot] = i;
}
a[++tot] = n + 1;
dfs(1);
}