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\n",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 }