#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;
}