Uva11732(trie)

题意:给你n个字符串 用strcmp()两两比较 ,求字符比较的总次数

分析:

数据量很大我们考虑用孩子兄弟表示法来表示字典树

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 0;
const int MAXNODE =    4000010;
int n, cas;
ll ans;
char str[4001];

struct Trie {
    int son[MAXNODE];
    int bro[MAXNODE];
    int val[MAXNODE];
    char ch[MAXNODE];
    int num;
    void init() { num = 1; ch[0] = val[0] = bro[0] = son[0] = 0; }
        //孩子兄弟表示法
    void build(char *s) {
        int len = strlen(s), u = 0, v;
        for(int i=0;i<=len;++i){
            for (v = son[u]; v; v = bro[v]) {
                if (ch[v] == s[i])
                    break;
            }
            if (!v) {
                v = num++;
                ch[v] = s[i];
                bro[v] = son[u];
                son[v] = 0;
                val[v] = 0;
                son[u] = v;
            }
            ans += (val[u] - val[v]) * (2 * i + 1);//每插入一个串累加比较次数
            if (len == i) {
                ans += val[v] * (2 * i + 2);
                val[v]++;
            }
            val[u]++;
            u = v;
        }
    }
} trie;
int main() {
    while (~scanf("%d", &n) && n) {
        trie.init();
        ans = 0;
        for (int i=0;i<n;++i) {
            scanf("%s", str);
            trie.build(str);
        }
        printf("Case %d: %lld\n", ++cas, ans);
    }
    return 0;
}    
时间: 2024-10-12 11:25:23

Uva11732(trie)的相关文章

HDU 1247 Hat&#39;s words(Trie)

HDU 1247 Hat's words(Trie) ACM 题目地址: HDU 1247 Hat's words 题意: 给些单词,问每个单词是否能用另外两个单词拼出. 分析: 直接保存到trie里面,然后暴力切割查询即可. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: 1247.cpp * Create Date: 2014-09-24 11:04:11 * Descripton: */ #include <cstdio

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

HDU 1671 Phone List (Trie)

Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12879    Accepted Submission(s): 4391 Problem Description Given a list of phone numbers, determine if it is consistent in the sense th

LA3942-Remember the Word(Trie)

题意: 有s个不同的单词,给出一个长字符串把这个字符串分解成若干个单词的连接(可重复使用),有多少种分解方法 分析: dp[i]表示i开始的字符串能分解的方法数 dp[i]=sum(dp[i+len(x)]);单词x是i开始的字符串的前缀. #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #

UVA 3942 - Remember the Word (Trie)

3942 - Remember the Word Neal is very curious about combinatorial problems, and now here comes a problem about words. Knowing that Ray has a photographic memory and this may not trouble him, Neal gives it to Jiejie. Since Jiejie can't remember number

机房测试:race(trie)

题目: 分析: 先不考虑天数的限制,直接对每一个人建一颗trie. 对于每一个人来说,他的x的贡献来源于trie树上所有在他右边的点(都比他大). 将每一个子树所有的叶子结点记为f,x^2=(f1+f2+……fx)^2 将右式拆开看:f i *f i + f i * f j *2(枚举i,j统计贡献,*2是因为 i 和 j 可以交换) 再加上天数的限制:每一个人的A[i]异或上天数 j,相当于trie树的形态发生改变了(01边交换) 对于1来说,又多了一部分贡献,也就是说,对于右子树来说,当且仅

(trie)HDU1251 统计难题

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 注意:本题只有一组测试数据,处理到文件结束. Output对于每个提问,给出以该字符串为前缀的单词的数量. Sa

LibieOJ 6170 字母树 (Trie)

题目链接 字母树 (以每个点为根遍历,插入到trie中,统计答案即可)——SamZhang #include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) #define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int N = 5010; struct

hihoCoder 1014 Trie树 (Trie)

#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小Hi和小Ho是一对好朋友.出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天.他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:"小Ho.你能不能对于每个我给出的字符串,都在这个词典里面找到以这个字符串开头的全部单词呢?" 身经百战的小Ho答道:"怎么会不能呢!你每给我一个字符串,我就依次遍历词典里的全