zoj 2876 Phone List【字典树】【水】

来源:互联网 发布:js实现二级联动菜单 编辑:程序博客网 时间:2024/05/16 17:25

如果一个号码就是另外一个号码的前缀就输出NO

注意应该将号码按照长度升序排序。

写的很乱,本来这个代码就不是为了这道题写的。

我只是测试一下这种建树的方式对不对


#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>#define _MAX 1000000#define MAXSON 10#define BASE -'0'using namespace std;typedef struct __node{int next, key;}node;node m[_MAX];int nlen;void newNode(int n){m[n].next = -1;m[n].key = -1;}void init(){}void buildNode(int n){int i;m[n].next = nlen;for(i=0; i<MAXSON; i++){newNode(nlen);nlen ++;}}int addNode(char *s){int i, p=0;for(i=0; i<strlen(s); i++){if(m[p].next == -1)buildNode(p);p = m[p].next + s[i] + BASE;if(m[p].key != -1)return 0;}m[p].key = 1;return 1;}int cmp(const void *a, const void *b){return strlen((char *)a ) - strlen((char *)b);}int main(){int i, n, flag, t;char s[10001][100];scanf("%d", &t);while(t--){flag = 1;nlen = 1;newNode(0);scanf("%d", &n);for(i=0; i<n; i++)scanf(" %s", s[i]);qsort(s, n, sizeof(s[0]), cmp);for(i=0; i<n; i++)if(flag)flag = addNode(s[i]);if(flag == 0)printf("NO\n");elseprintf("YES\n");}return 0;}


原创粉丝点击