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;
}
posted @ 2012-11-02 20:08  TO_Asia  阅读(128)  评论(0编辑  收藏  举报