zoukankan      html  css  js  c++  java
  • 洛谷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);
    }
    
  • 相关阅读:
    纯快排
    Quick Sort(快速排序)
    归并排序 ALDS1_5_B:Merge Sort
    单调栈(POJ2559)
    Sequence
    Codeforces Round #503
    度度熊学队列
    Always Online hdu 6350
    Hills And Valleys
    Problem G. Depth-First Search
  • 原文地址:https://www.cnblogs.com/Sai0511/p/11175370.html
Copyright © 2011-2022 走看看