uva 1519 - Dictionary Size(字典树)
2024-08-24 04:03:05
题目链接: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];
}
}
最新文章
- js 滚动的文字(走马灯)
- Iterator(迭代器)-对象行为型模式
- ios 开发中出现的 pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug
- 《javascript高级程序设计》第六章 Object Creation VS Inheritance
- java多线程:并发包中ReentrantLock锁的公平锁原理
- 外中断之swi软件中断:
- Java应用程序实现屏幕的";拍照";
- Golang在视频直播平台的高性能实践
- relative、absolute和float
- linux 目录及文件的命名规则、ls操作
- python 绘制柱状图
- 电脑修改密码后git上传失败Authentication failed
- 关于WEB前端开发的工具
- java 集合(一)ArrayList的继承树
- uvalive 4960 Sensor Network
- Linux用户创建/磁盘挂载相关命令
- web前端的问题整理
- BZOJ1855 股票交易 单调队列优化 DP
- php操作文件类的函数
- Java map双括号初始化方式的问题