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)种,那么实际上一共只能组成1 + x + y(比如上面的例子,一共就能组成空串,a, aa, aaa, aaaa, aaaaa, aaaaaa种)这样减掉就得到x*y,这样一来只要在建Trie的过程中,记录下每种字符各出现多少个就能算了(注意开头的单独一个不能算,因为要非空),然后还有一点要注意的,就是长度为1的字符串,由于题目单词可以来自原字典,而长度1的字符串在计算过程并没有算进去,所以还要单独出来算

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXNODE = 400005;
const int SIGMA_SIZE = 26;

struct Trie {
    int ch[MAXNODE][SIGMA_SIZE];
    int cnt[SIGMA_SIZE];
    int sz;

    void init() {
	sz = 1;
	memset(ch[0], 0, sizeof(ch[0]));
	memset(cnt, 0, sizeof(cnt));
    }

    int idx(char c) {
	return c - 'a';
    }

    void insert(char *s) {
	int n = strlen(s);
	int u = 0, v;
	for (int i = 0; i < n; i++) {
	    int c = idx(s[i]);
	    if (!ch[u][c]) {
		memset(ch[sz], 0, sizeof(ch[sz]));
		ch[u][c] = sz++;
		if (i) cnt[c]++;
	    }
	    u = ch[u][c];
	}
    }
}pre, suf;

typedef long long ll;
int n, vis[26];
char str[45];

int main() {
    while (~scanf("%d", &n)) {
	pre.init(); suf.init();
	memset(vis, 0, sizeof(vis));
	while (n--) {
	    scanf("%s", str);
	    if (strlen(str) == 1)
		vis[str[0] - 'a'] = 1;
	    pre.insert(str);
	    reverse(str, str + strlen(str));
	    suf.insert(str);
	}
	ll ans = (ll)(pre.sz - 1) * (suf.sz - 1);
	for (int i = 0; i < 26; i++)
	    ans -= (ll)pre.cnt[i] * suf.cnt[i] - vis[i];
	printf("%lld\n", ans);
    }
    return 0;
}

UVA 1519 - Dictionary Size(Trie树),布布扣,bubuko.com

时间: 2024-10-14 17:37:30

UVA 1519 - Dictionary Size(Trie树)的相关文章

uva 1519 - Dictionary Size(字典树)

题目链接:uva 1519 - Dictionary Size 题目大意:给出n个字符串组成的字典,现在要添加新的单词,从已有单词中选出非空前缀和非空后缀,组成新单词.问说能组成多少个单词. 解题思路:建立一棵前缀树和一棵后缀树,有多少节点即为有多少个前缀,扣除中间的部分即可加上长度为1的字符串即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

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

Trie树标准模版

这是一个Trie树标准模版 By Leo 本人版权,请勿抄袭!! 先看教程:  1. 什么是trie树 1.Trie树 (特例结构树) Trie树,又称单词查找树.字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高.      Trie的核心思想是空间换时间.利用字符串的公共前缀来降低查询时间的开销以达到提高效率

杭电 HDU 1247 ACMHat’s Words(trie树 或着STL)

Hat's Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9620    Accepted Submission(s): 3438 Problem Description A hat's word is a word in the dictionary that is the concatenation of exactl

Trie树学习2

数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib> #

Trie树

Trie树,即字典树或单词查找树,主要用于大量字符串的检索.去重.排序等操作. 主要原理就是利用字符串的公共前缀建立一棵多叉树,牺牲空间换取时间. 1 //Trie树 2 #include <iostream> 3 #include <string> 4 using std::cin; 5 using std::cout; 6 using std::endl; 7 using std::string; 8 9 const int SIZE = 26; 10 const char B

POJ 2503 Babelfish (Trie树 或 map)

Babelfish Time Limit: 3000MS        Memory Limit: 65536K Total Submissions: 34278        Accepted: 14706 Description You have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language. Fortunately

利用Trie树求多个字符串编辑距离的进一步优化

1.引言 题目的意思应该是:在一个给定的字典中,求与给定的字符串的编辑距离不大于2的所有的单词.原先写过两片关于此问题的文章,那两片篇章文章给出两种解决思路:其一是暴力求解法,这种方法最容易想到.就是将词典中的词一一与给定的字符串计算编辑距离,不大于2的输出,大于2的舍弃,这种方法思路简单但是很费时间.其二根据词典中这些词之间的编辑距离建立一个以单词为节点的Trie树,遍历的时候,通过计算根节点与给定字符串的编辑距离就可以排除掉一部分分支了,然后继续计算该字符串与剩余的分支的根的编辑距离,继续排

【数据结构】Trie树

1.Trie树简介 Trie树,又称字典树.前缀树,被用于信息检索(information retrieval)的数据结构.Trie一词便来自于单词retrieval.基本思想:用字符串的公共前缀降低查询时间.比如,在最优的查询二叉树中查询关键字的时间复杂度为M * log N,M是字符串最大长度,N为字符串数量:而用Trie树时,只需O(M)时间. [1] 中给出一个简单Trie树例子,蓝色表示一个单词结尾:该Trie树存储的单词为the, their, there, a, any, answ