码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 11732 strcmp() Anyone? (压缩版字典树)

时间:2015-10-30 20:21:42      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2832

按照正常的字典树建树会MLE

所以需要采用树的压缩算法来建树

#include <cstdio>
#include <iostream>
#include <cstring>
#define maxn 4000010
#define maxl 1010
using namespace std;

typedef long long LL;

typedef struct _node {
    char value;
    int size;
    int count;
    _node* lchild;
    _node* rchild;
} node;

node dict[maxn];
char str[maxl];

class Trie
{
    private:
        LL count;
        int size;
        node* root;
        
    public:
        
        Trie()
        {
            init();
        }
        
        void init()
        {
            memset( dict, 0, sizeof(dict));
            size = 0;
            count = 0;
            root = new_node(0);
        }
        
        node* new_node(char c)
        {
            dict[size].value = c;
            return &dict[size++];
        }
        
        void insert(char* word)
        {
            int len = (int)strlen(word), same = 1;
            node* now = root->rchild;
            node* pa = root;
            for (int i = 0; i <= len; ++i)
            {
                if (!now)
                {
                    pa->rchild = new_node( word[i]);
                    now = pa->rchild;
                    now->count = 1;
                    same = 0;
                }
                else
                {
                    if (i)
                        count += now->count;
                    count += now->count++;
                    
                    while (now->lchild && now->value != word[i])
                        now = now->lchild;
                    if (now->value != word[i])
                    {
                        now->lchild = new_node( word[i]);
                        now = now->lchild;
                        same = 0;
                    }
                }
                pa = now;
                now = pa->rchild;
            }
            
            if (same)
                pa->size++;
            count += pa->size;
        }
        
        LL query()
        {
            return count;
        }
} trie;

int main(void)
{
    int ca = 1, n;
    while (scanf("%d", &n), n)
    {
        Trie trie = Trie();
        for (int i = 0; i < n; ++i)
        {
            scanf("%s", str);
            trie.insert( str);
        }
        printf("Case %d: %lld\n", ca++, trie.query());
    }
    return 0;
}

 

UVA 11732 strcmp() Anyone? (压缩版字典树)

标签:

原文地址:http://www.cnblogs.com/chuninsane/p/4924239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!