hdu1671 字典树

来源:互联网 发布:张国荣过誉 知乎 编辑:程序博客网 时间:2024/05/17 06:27

     做法很多,map,hash,字典树都行。

    大致题意:判断是否有存在数字是其他数字的前缀。写字典树要注意释放内存,不然会MLE

 AC代码:

#include<cstdio>#include<cstring>#include<string>#include<iostream>using namespace std;const int maxn=1e4+5;const int Max=10;char s[maxn][11];struct node{node* next[Max];int v;node(){for(int i=0;i<Max;++i) next[i]=NULL;v=-1;}}*root;void init(){ //建立根结点 root=new node();}void insert(char *ch){int n=strlen(ch);//printf("length=%d\n",n);node *p=root,*q;for(int i=0;i<n;++i){int c=ch[i]-'0';if(p->next[c]==NULL){q=new node();q->v=1;p->next[c]=q;p=p->next[c];}else {p->next[c]->v++;p=p->next[c];}}}int find(char *ch){int ans;node *p=root;int n=strlen(ch); for(int i=0;i<n;++i){int c=ch[i]-'0';if(p->next[c]==NULL) return 0;p=p->next[c];ans=p->v;}return ans;}void free_tree(node *u){for(int i=0;i<Max;++i){if(u->next[i]==NULL) continue;else free_tree(u->next[i]);}delete u;}int main(){int T;scanf("%d",&T);while(T--){init();int n;scanf("%d",&n);for(int i=0;i<n;++i){scanf("%s",s[i]);insert(s[i]);}int flag=1,ans;for(int i=0;i<n;++i){if((ans=find(s[i]))>1) {//printf("%d\n",ans); flag=0;break;}}if(flag) printf("YES\n");else printf("NO\n");free_tree(root);}return 0;} 

如有不当之处欢迎指出!

0 0