bzoj2251 [2010Beijing Wc]外星联络

  因为n很小,所以对于串s的每一个后缀,都把其加入字典树中,并且经过一个字典树节点,该节点权值就+1。

  输出时因为要字典序最小,所以字典树先走0分叉,再走1分叉,如果节点权值大于等于2就输出

  代码

 1 #include<cstdio>
 2 const int N  = 5001010;
 3 int n,sum[N],f[N][2],tot,i;
 4 char s[N];
 5 void gao(int x)
 6 {
 7     int t=0,i;
 8     for (i=x;i<n;i++)
 9     {
10         if (f[t][s[i]-48]==0)
11         f[t][s[i]-48]=++tot;
12         t=f[t][s[i]-48];
13         sum[t]++;
14     }
15 }
16 void out(int x)
17 {
18     if (sum[x]>1)
19     printf("%d
",sum[x]);
20     if (f[x][0]) out(f[x][0]);
21     if (f[x][1]) out(f[x][1]);
22 }
23 int main()
24 {
25     scanf("%d",&n);
26     scanf("%s",s);
27     for (i=0;i<n;i++)
28     gao(i);
29     out(0);
30 } 
原文地址:https://www.cnblogs.com/fzmh/p/5510235.html