您的位置:首页 > 其它

bzoj2251 [2010Beijing Wc]外星联络

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

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

  代码

#include<cstdio>
const int N  = 5001010;
int n,sum
,f
[2],tot,i;
char s
;
void gao(int x)
{
int t=0,i;
for (i=x;i<n;i++)
{
if (f[t][s[i]-48]==0)
f[t][s[i]-48]=++tot;
t=f[t][s[i]-48];
sum[t]++;
}
}
void out(int x)
{
if (sum[x]>1)
printf("%d\n",sum[x]);
if (f[x][0]) out(f[x][0]);
if (f[x][1]) out(f[x][1]);
}
int main()
{
scanf("%d",&n);
scanf("%s",s);
for (i=0;i<n;i++)
gao(i);
out(0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: