博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 1519 - Dictionary Size(字典树)
阅读量:6931 次
发布时间:2019-06-27

本文共 1495 字,大约阅读时间需要 4 分钟。

题目大意:给出n个字符串组成的字典。如今要加入新的单词,从已有单词中选出非空前缀和非空后缀,组成新单词。

问说能组成多少个单词。

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

#include 
#include
#include
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]; }}

转载地址:http://nrpjl.baihongyu.com/

你可能感兴趣的文章
从 Google 的一道面试题说起·
查看>>
红帽企业版Linux成为Linux下的.NET Core的参考平台
查看>>
架构周报:微信后台系统的演进之路
查看>>
Visual Studio 2017 15.9 Previews扩展C++调试功能
查看>>
mac 下简单安装reids
查看>>
在我的职业生涯中,没有一种技能比SQL更有用!
查看>>
《番茄工作法图解》作者亲身讲解:这些最佳实践可以帮你筛选出那个最重要的任务...
查看>>
微软向Linux社区开放60000多项专利:对开源微软是认真的
查看>>
QCon上海2015精彩演讲前瞻:一线互联网公司架构实践
查看>>
Visual Studio 2019正式版发布,专注于人工智能和生产力
查看>>
Java 11正式发布,新特性解读
查看>>
Oracle进击云计算,搅局者or生力军?
查看>>
苹果公司发布TestFlight Groups,放宽二进制版本提交限制
查看>>
NGINX发布支持动态配置的开源Web服务器
查看>>
敏捷宣言和企业Scrum作者Mike Beedle去世
查看>>
Netflix混沌工程手册Part 2:混沌工程原则
查看>>
图数据库并非要取代区块链,而是让区块链如虎添翼
查看>>
Google提出Grasp2Vec模型:利用自监督方法学习物体表示
查看>>
全面布局“边” “端”,腾讯云边缘计算技术探索及落地应用
查看>>
Visual Studio 2017 15.9预览版3支持ARM64 for UWP
查看>>