暑假- Trie树-(D - Phone List)

来源:互联网 发布:蒙泰打印机端口在哪里 编辑:程序博客网 时间:2024/06/08 09:27
/*题意:给你一堆电话号码,如果没有任何一个人的电话号码是其他的电话号码的前缀,则输出“YES”,否则输出“NO”。思路:trie树,是不是其他号码的前缀只要判断最后一个数字出现的次数,若只出现一次则这个号码不会是其他号码的前缀,否则是其他号码的前缀。*/#include<iostream>#include<cstring>using namespace std;const int MAXM=100005;struct Node{int value;Node *child[26];Node(){value=0;memset(child,NULL,sizeof(child));}}*root;char num[MAXM][15];//保存号码bool temp;//判断是否出现前缀号码void create(char s[])//建树{Node *x=root;for(int i=0;i<strlen(s);i++){int d=s[i]-'0';if(x->child[d]==NULL){x->child[d]=new Node;}x=x->child[d];}x->value++;//最后一个数字的value++}void Search(char s[])//判断{Node *x=root;int len=strlen(s);for(int i=0;i<len;i++)//循环出来后,X即为最后一个数码的节点。{int d=s[i]-'0';x=x->child[d];}if(x->value!=1)//若出现不止一次。{temp=false;}}void DeleteNode(Node *x)//删除之前节点的信息{if(x==NULL){return;}for(int i=0;i<26;i++){if(x->child[i]!=NULL){DeleteNode(x->child[i]);}}delete x;}int main(){int t,n;cin>>t;while(t--){temp=true;cin>>n;root = new Node;for(int i=0;i<n;i++){cin>>num[i];create(num[i]);}for(int j=0;j<n;j++){Search(num[j]);if(temp==false)//只要出现一个前缀字符,其他就不用判断了{break;}}if(temp){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}DeleteNode(root);}return 0;}

0 0