uva 1519 - Dictionary Size(字典树)

题目链接:uva 1519 - Dictionary Size

题目大意:给出n个字符串组成的字典,现在要添加新的单词,从已有单词中选出非空前缀和非空后缀,组成新单词。问说能组成多少个单词。

解题思路:建立一棵前缀树和一棵后缀树,有多少节点即为有多少个前缀,扣除中间的部分即可加上长度为1的字符串即可。

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 400005;
const int sigma_size = 26;
typedef long long ll;

struct Tire {
    int sz, g[maxn][sigma_size];
    int c[sigma_size];

    void init ();
    int idx(char ch);
    void insert(char* s);
}pre, suf;

int main () {
    int N;
    while (scanf("%d", &N) == 1 && N) {
        char word[45];
        int vis[sigma_size];
        memset(vis, 0, sizeof(vis));

        pre.init();
        suf.init();

        for (int i = 0; i < N; i++) {
            scanf("%s", word);

            int n = strlen(word);
            if (n == 1)
                vis[word[0] - ‘a‘] = 1;

            pre.insert(word);
            reverse(word, word + n);
            suf.insert(word);
        }

        ll ans = (ll)(pre.sz - 1) * (suf.sz - 1);
        for (int i = 0; i < sigma_size; i++)
            ans -= (ll)pre.c[i] * suf.c[i] - vis[i];
        printf("%lld\n", ans);
    }
    return 0;
}

void Tire::init () {
    sz = 1;
    memset(g[0], 0, sizeof(g[0]));
    memset(c, 0, sizeof(c));
}

int Tire::idx (char ch) {
    return ch - ‘a‘;
}

void Tire::insert(char* s) {
    int u = 0, n = strlen(s);

    for (int i = 0; i < n; i++) {
        int v = idx(s[i]);

        if (g[u][v] == 0) {
            memset(g[sz], 0, sizeof(g[sz]));
            g[u][v] = sz++;
            if (i)
                c[v]++;
        }

        u = g[u][v];
    }
}
时间: 2024-10-15 05:51:35

uva 1519 - Dictionary Size(字典树)的相关文章

UVA 1519 - Dictionary Size(Trie树)

UVA 1519 - Dictionary Size 题目链接 题意:有一个字典,里面包含一些词,要求组合新词,新词必须来自原字典,或者由原字典的字符串的非空前缀和非空后缀组成,问一共能组成多少个新词 思路:建Trie树,可以求出不同的前缀和后缀个数,然后相乘,这样做会有一部分重复的 比如Aaaa,aaaA的情况,就重复了,去重的方法可以推理出来 假设前缀A后面有x个a,后缀y个a后面一个A,那么这x和y个一共一边各有(x+1)和(y+1)种情况,相乘一共是(x+1)(y+1)种,那么实际上一共

UVa 1519 Dictionary Size

方法:Trie 看了题解,有两种做法,大致是相通的.这道题重点在于如何判重. 建立两个trie,取名prefix 和 suffix.把所有string插入第一个trie,每个节点就代表一种prefix.同理,把所有string反转之后插入第二个trie,每个节点就代表一个suffix.如果没有重复的话,那么结果就是prefix.size * suffix.size.如何判重呢?如果一个长度至少为2的前缀p以字符c结尾,并且有一个长度至少为2的后缀 s以c开始,那么 p+s.substring(1

uva 1385 - Billing Tables(字典树)

题目链接:uva 1385 - Billing Tables 题目大意:给定n个电话前缀,每个前缀是一个区域的前缀,现在要生成一个新的电话单,即对于每个电话号码,从旧的电话单上从前向后遍历,如果出现前缀匹配,则该电话号码对应的即为当前的区号,要求生成的新电话单尽量小. 解题思路:用dfs建立字典树,在区间范围内的点对应均为对应的区号,注意如果70.71.72....79都为SB的话,那么可以合并成7,并且对应区号为SB. 注意合并的条件为区号相同即可,并不是说对应旧电话单匹配位置相同. 注意这组

uva 1556 - Disk Tree(字典树)

题目连接:uva 1556 - Disk Tree 题目大意:给出N个目录关系,然后按照字典序输出整个文件目录. 解题思路:以每个目录名作为字符建立一个字典树即可,每个节点的关系可以用map优化. #include <cstdio> #include <cstring> #include <map> #include <string> #include <iostream> #include <algorithm> using nam

uva 11732 - strcmp() Anyone?(字典树)

题目链接:uva 11732 - strcmp() Anyone? 题目大意:给定n个串,然后两两之间比较,问说总共要比较多少次. 解题思路:字典树,建立出字典树,然后根据字典树的性质在节点记录有多少个字符串包含该节点.因为节点的个数比较多,所以用左孩子右兄弟的方法建立字典树. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long

UVA Phone List (字典树)(查询是否有前缀或自身是其他的前缀)

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16341   Accepted: 5228 Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogu

UVA 12333 大数,字典树

题意:给一个数字,看他最小是第几个菲波那切数列的前缀. 分析: 大数模板就是吊哦. 将菲波那切数列前500个数字放到字典树上.注意插入的时候不能像普通一样,只在尾节点处标记,而是一路标记下去. #include <bits/stdc++.h> using namespace std; const int NV = 10000; const int ra = 10; int ten[4] = {1,ra,ra*ra,ra*ra*ra}; int radix = ra*ra*ra*ra; stru

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

题目链接: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 ma

uva 11488 - Hyper Prefix Sets(字典树)

H Hyper Prefix Sets Prefix goodness of a set string is length of longest common prefix*number of strings in the set. For example the prefix goodness of the set {000,001,0011} is 6.You are given a set of binary strings. Find the maximum prefix goodnes