2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
NO YES
题意:判断给定号码中是否存在某个号码是其他某号码的前缀,存在输出“NO”,否则输出“YES”。
解析:利用字典树处理。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1671
代码清单:
#include<map> #include<cmath> #include<stack> #include<queue> #include<ctime> #include<cctype> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int MAX = 11; struct trie{ int point; trie *next[MAX]; }; trie *root; int t,n,flag; char s[MAX]; void Trie(char *s){ trie *p=root, *q; int len=strlen(s), pos; for(int i=0;i<len;i++){ pos=s[i]-'0'; if(p->next[pos]==NULL){ q=new trie; q->point=0; for(int j=0;j<MAX;j++) q->next[j]=NULL; p->next[pos]=q; p=p->next[pos]; } else{ if(p->next[pos]->point){ //前面某个号码是当前的前缀 flag=1; return ; } p=p->next[pos]; } } p->point=1; for(int i=0;i<MAX;i++){ if(p->next[i]){ //当前号码是前面某个号码的前缀 flag=1; return ; } } } void delTrie(trie *Root){ //释放内存空间 for(int i=0;i<MAX;i++){ if(Root->next[i]!=NULL) delTrie(Root->next[i]); } free(Root); } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); root=new trie; for(int i=0;i<MAX;i++) root->next[i]=NULL; flag=0; for(int i=0;i<n;i++){ scanf("%s",s); Trie(s); } if(flag) printf("NO\n"); else printf("YES\n"); delTrie(root); } return 0; }
原文:http://blog.csdn.net/jhgkjhg_ugtdk77/article/details/44609447