洛谷P5329 [SNOI2019]字符串
好像\(dfs O(n)\)暴力可以毫无压力的轻松过,
当然你要写\(\text{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\n%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);
}