洛谷P5329 [SNOI2019]字符串

好像(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);
}
原文地址:https://www.cnblogs.com/Sai0511/p/11175370.html