#dfs,trie#洛谷 4341 [BJWC2010]外星联络

题目


分析

首先时间复杂度\(O(n^2)\)可过,统计子串个数可以用trie或者更高级的方法
可以枚举所有的后缀,然后建一个trie,这样这个trie就可以记录全部的子串
关于字典序排序,深搜的时候先搜0再搜1就可以了


代码

#include <cstdio>
#define rr register
using namespace std;
int cnt[9000011],trie[9000011][2],n,tot;
char s[3011];
inline void print(int ans){
    if (ans>9) print(ans/10);
    putchar(ans%10+48);
}
inline void dfs(int root){
    if (cnt[root]>1) print(cnt[root]),putchar(10);
    if (trie[root][0]) dfs(trie[root][0]);
    if (trie[root][1]) dfs(trie[root][1]);
}
signed main(){
    scanf("%d\n%s",&n,s+1);
    for (rr int i=1;i<=n;++i){
        rr int p=0;
        for (rr int j=i;j<=n;++j){
            if (!trie[p][s[j]^48]) trie[p][s[j]^48]=++tot;
            ++cnt[p=trie[p][s[j]^48]];
        }
    }
    dfs(0);
    return 0;
}
posted @ 2020-08-06 22:46  lemondinosaur  阅读(96)  评论(0编辑  收藏  举报