POJ_3630

    为了练一下字典树所以做了这个题目,开数组的时候虽然号码只有10000个,但字典树的数字元素却一共可能有100000个。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 10010
#define MAXD 100010
char dig[MAXN][15];
int len[MAXN], r[MAXN], N;
int flag[MAXD], next[MAXD][10], e;
int cmp(const void *_p, const void *_q)
{
int *p = (int *)_p;
int *q = (int *)_q;
return len[*q] - len[*p];
}
void init()
{
int i, j, k;
scanf("%d", &N);
for(i = 0; i < N; i ++)
{
scanf("%s", dig[i]);
len[i] = strlen(dig[i]);
}
for(i = 0; i < N; i ++)
r[i] = i;
qsort(r, N, sizeof(r[0]), cmp);
}
void insert(int cur, int k)
{
++ e;
flag[e] = 0;
memset(next[e], 0, sizeof(next[e]));
next[cur][k] = e;
}
int solve()
{
int i, j, k, p, cur;
e = 0;
memset(next[e], 0, sizeof(next[e]));
for(i = 0; i < N; i ++)
{
p = r[i];
cur = 0;
for(j = 0; dig[p][j]; j ++)
{
k = dig[p][j] - '0';
if(!next[cur][k])
insert(cur, k);
flag[cur] = 1;
cur = next[cur][k];
}
if(flag[cur])
return 0;
flag[cur] = 1;
}
return 1;
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
init();
printf("%s\n", solve() ? "YES" : "NO");
}
return 0;
}


posted on 2012-01-12 17:36  Staginner  阅读(179)  评论(0编辑  收藏  举报