http://acm.hdu.edu.cn/showproblem.php?pid=1671
依旧是Trie树,和上一题差不太多
View Code
#include <stdio.h> #include <string.h> #include <stdlib.h> const int MAX=10; typedef struct Trie { Trie *next[MAX]; int v; }; Trie *root; void create(char *str) { int len=strlen(str); Trie *p=root,*q; for(int i=0;i<len;i++) { int id=str[i]-'0'; if(p->next[id]==NULL) { q=(Trie*)malloc(sizeof(Trie)); q->v=1; for(int j=0;j<MAX;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else { p->next[id]->v++; p=p->next[id]; } } p->v=-1; } int find(char *str) { int len=strlen(str); Trie *p=root; for(int i=0;i<len;i++) { int id=str[i]-'0'; p=p->next[id]; if(p==NULL)return 0; if(p->v==-1)return -1; } return -1; } int del(Trie*T) { if(T==NULL)return 0; for(int i=0;i<MAX;i++) if(T->next[i]!=NULL) del(T->next[i]); free(T); return 0; } int main() { char str[20]; int t,n,i; scanf("%d",&t); while(t--) { int flag=0; root=(Trie*)malloc(sizeof(Trie)); for(i=0;i<MAX;i++) root->next[i]=NULL; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",str); if(flag)continue; if(find(str)==-1)flag=1; create(str); } if(flag)puts("NO"); else puts("YES"); del(root); } return 0; }