洛谷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);
}
posted @ 2019-07-12 12:22  _connect  阅读(162)  评论(0编辑  收藏  举报
Live2D