题目链接: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];
}
}

最新文章

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

热门文章

  1. jsp中标签id和name的区别(转)
  2. 【Unity3D自学记录】鼠标移动三维物体
  3. Talk the Talk
  4. 【Java】Java Socket 通信演示样例
  5. Ubuntu配置图形桌面LXDE和VNC、中文语言包、中文输入法
  6. 修改shm,oracle11g需要扩大共享内存
  7. ANSI转UTF-8中文无乱码解决方案
  8. Android---- 获取当前应用的版本号和当前android系统的版本号
  9. 关于http请求指定本地ip
  10. 观察者模式 VS 责任链模式