HDU 1671 字典树

来源:互联网 发布:painttool sai mac版 编辑:程序博客网 时间:2024/06/06 05:06

先解释题意:给T组数据,每组数据有N个电话号码,要求每个电话号码不能是其他电话号码的前缀,若满足要求输出YES 否则输出NO

一开始WA,看了下题解 觉得很复杂........且个人认为可以更简单些。。。。。。。。

于是自己卡了半个小时 AC(这个故事告诉我们  不要总看题解,自己想的也不错,这也是一个ACMer应有的品质吧)

就两个判断就OK了    

1.当前串能不能作为其他串的前缀

2.其他串能不能作为当前串的前缀

弄明白这两个基本就可以A了

#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct node;struct node{int num;int id;struct node *N[10];};struct node *root;int  insert(char *s){int i,j,n,m;n=strlen(s);i=0;struct node *p,*q;q=root;while(i<n){if(q->N[s[i]-'0']!=NULL){q=q->N[s[i]-'0'];}else{p=(struct node *)malloc(sizeof(struct node));memset(p,NULL,sizeof(struct node));q->N[s[i]-'0']=p;q=p;}if(q->num==1)//判断之前有没有某个串是该串的前缀return 1;i++;if(i==n) //判断该串是不是之前某个串的前缀 if(q->id==1)return 1;q->id=1;}if(q->num==1)return 1;q->id=1;q->num=1;return 0;}void del(node *root){for(int i=0;i<10;i++)if(root->N[i]) del(root->N[i]);delete(root);}int main(){int i,j,n,m;char s[100100];scanf("%d",&m);int mark;while(m--){mark=0;root=(struct node *)malloc(sizeof(struct node));memset(root,NULL,sizeof(struct node));scanf("%d",&n);for(i=1;i<=n;i++){scanf("%s",s);if(mark==0)if(insert(s)){mark=1;}}if(mark==0)printf("YES\n");elseprintf("NO\n");del(root);//释放内存 }return 0;}


0 0