因为n很小,所以对于串s的每一个后缀,都把其加入字典树中,并且经过一个字典树节点,该节点权值就+1。
输出时因为要字典序最小,所以字典树先走0分叉,再走1分叉,如果节点权值大于等于2就输出
代码
#include<cstdio>
const int N = ;
int n,sum[N],f[N][],tot,i;
char s[N];
void gao(int x)
{
int t=,i;
for (i=x;i<n;i++)
{
if (f[t][s[i]-]==)
f[t][s[i]-]=++tot;
t=f[t][s[i]-];
sum[t]++;
}
}
void out(int x)
{
if (sum[x]>)
printf("%d\n",sum[x]);
if (f[x][]) out(f[x][]);
if (f[x][]) out(f[x][]);
}
int main()
{
scanf("%d",&n);
scanf("%s",s);
for (i=;i<n;i++)
gao(i);
out();
}