hdu1671 字典树
http://acm.hdu.edu.cn/showproblem.php?pid=1671
7067664 | 2012-11-02 20:02:57 | Accepted | 1671 | 390MS | 3352K | 945 B | C++ | TO_Asia |
字典树~~ 找手感中~~
isnext=1 记录是否有下一个节点,判断前缀后出现的情况。
isnext=2 表示是一个字串的最后一个字符,判断前缀先出现的情况。
#include<iostream> #include<stdio.h> #include<string> using namespace std; class node { public: int isnext; node* next[10]; node(){isnext=0;for(int i=0;i<10;i++)next[i]=NULL;} }; void del(node *now) { for(int i=0;i<10;i++) if(now->next[i]!=NULL) del(now->next[i]); delete now; } int main() { int T,n,i,j,temp; string s; scanf("%d",&T); while(T--) { scanf("%d",&n); node *tree=new node; node *head=tree; int ans=1; for(i=0;i<n;i++) { cin>>s;tree=head; for(j=0;j<s.length();j++) { temp=s[j]-'0'; if(tree->next[temp]==NULL) { tree->next[temp]=new node; tree->isnext=1; } tree=tree->next[temp]; if(tree->isnext==2) { ans=0; } if(j==s.length()-1) { if(tree->isnext==1)ans=0; tree->isnext=2; } } } if(ans)cout<<"YES"<<endl; else cout<<"NO"<<endl; del(head); } return 0; }