一道字典树的模板题,每次插入前查询是否有该串的某个前缀子串存在,或者该串是否某个串的前缀。具体实现是在插入时串的结尾做一个标记,如果某一个串在查询的时候找到一个标记,说明存在前缀;第二种情况是这个串遍历结束后还是没有发现一个空的,也即该串是某个串的子串。最后需要注意的是动态申请空间需要及时释放空间,不然会MLE。
AC代码
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 struct node 5 { 6 node *ne[10]; 7 int v; 8 }*head; 9 void insert(char *s) 10 { 11 node *p=head,*q; 12 for(int i=0;s[i];i++) 13 { 14 int id=s[i]-'0'; 15 if(p->ne[id]==NULL) 16 { 17 q=(node*)malloc(sizeof(node)); 18 for(int j=0;j<10;j++) 19 q->ne[j]=NULL; 20 q->v=1; 21 p->ne[id]=q; 22 p=p->ne[id]; 23 } 24 else 25 { 26 p=p->ne[id]; 27 } 28 } 29 p->v=-1; 30 } 31 int Q(char *s) 32 { 33 node *p=head; 34 for(int i=0;s[i];i++) 35 { 36 int id=s[i]-'0'; 37 p=p->ne[id]; 38 if(p==NULL) 39 return 0; 40 if(p->v==-1) 41 return -1; 42 } 43 return -1; 44 } 45 void clean(node *p) 46 { 47 if(p==NULL) return ; 48 for(int i=0;i<10;i++) 49 { 50 if(p->ne[i]!=NULL) 51 clean(p->ne[i]); 52 } 53 free(p); 54 return ; 55 } 56 int main() 57 { 58 int t,n; 59 char s[20]; 60 scanf("%d",&t); 61 while(t--) 62 { 63 head=(node*)malloc(sizeof(node)); 64 for(int i=0;i<10;i++) 65 head->ne[i]=NULL; 66 scanf("%d",&n); 67 int f=0; 68 while(n--) 69 { 70 scanf("%s",s); 71 if(Q(s)==-1){ 72 f=1; 73 //printf("%s+++ ",s); 74 } 75 if(f) continue; 76 insert(s); 77 } 78 if(f) puts("NO"); 79 else puts("YES"); 80 clean(head); 81 } 82 return 0; 83 }