hdu1671 trie树

字典树水题,题目大意就是找是否有字符串是其他字符串的前缀,有就NO,没有就YES。需要注意一下两点
1、
3
97625999
91125426
911
3
911
97625999
91125426
这两组数据的比较。
2、每次用完树需删除,否则会超内存!!!
直接附上AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>


using namespace std;
#define num 10


struct trie
{
    int flag;
    trie *Next[num];
    trie()
    {
        flag = 0;
        int i ;
        for(i = 0 ; i < num ; i ++ )
        {
            Next[i] = NULL;
        }
    }
}*current , *newnode;


void Delete(trie *p)
{
    if(p==NULL)
        return ;
    int i;
    for(i=0;i<10;i++)
    {
        Delete(p->Next[i]);
    }
    delete p;


}
int main()
{
    int t ;
    cin >> t ;
    while(t -- )
    {
        trie *mytrie = new trie ;
        int n;
        cin >> n ;
        getchar();
        char temp[10];
        int flag2 = 0 , flag3 = 0;
        for(int j = 0 ; j < n ; j ++ )
        {
            gets(temp);
            int len = strlen(temp);
            current = mytrie;
            if(!flag2 && !flag3)
            {
                for(int i = 0 ; i < len ; i ++ )
                {
                    int m = temp[i] - '0' ;
                    if(current->Next[ m ] != NULL)
                    {
                        if(current->Next[ m ]->flag == 1 && !flag2)
                        {


                            flag2 = 1 ;
                            break;
                        }
                        current = current->Next[m];
                        if(i == len - 1)
                        {
                            current -> flag = 1;
                            flag3 = 1 ;
                            break;
                        }
                    }
                    else
                    {
                        newnode = new trie;
                        current -> Next[m] = newnode;
                        current = newnode;
                        if(i == len - 1) current -> flag = 1;
                    }
                }
                if(flag2 ||flag3) continue;
            }
        }
        if(!flag2 && !flag3) cout << "YES" << endl;
        else cout << "NO" << endl ;
        Delete(mytrie);
    }


    return 0;
}


你可能感兴趣的:(hdu1671 trie树)