博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 11732 链表+字典树
阅读量:5250 次
发布时间:2019-06-14

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

因为字符集比较大,所以就不能用简单字典树,在字典树里面,用链表进行存储。这个倒是不难,练了下手

统计的时候还是有点难搞,因为要算所有的两两比较的次数之和,对分叉处进行计算,注意细节

#include 
#include
#include
using namespace std;const int N = 4000*1000+10;struct Trie{ int head[N]; int next[N]; char ch[N]; int tot[N]; int sz; long long ans; void clear() { sz=1; head[0]=next[0]=tot[0]=0; ans=0; } void insert(const char* s) { int u=0,v,len; len=strlen(s); tot[0]++; for (int i=0; i<=len; i++) { bool found=false; for (v=head[u]; v!=0; v=next[v]) { if (ch[v]==s[i]) { found=true; break; } } if (!found) { v=sz++; ch[v]=s[i]; tot[v]=0; next[v]=head[u]; head[u]=v; head[v]=0; } u=v; tot[u]++; } } void dfs(int depth, int u) //计算总数 { if(head[u] == 0) ans += tot[u] * (tot[u] - 1) * depth; else { int sum = 0; for(int v = head[u]; v != 0; v = next[v]) sum += tot[v] * (tot[u] - tot[v]); ans += sum / 2 * (2 * depth + 1); for(int v = head[u]; v != 0; v = next[v]) dfs(depth+1, v); } } long long count() { ans = 0; dfs(0, 0); return ans; }} T;char str[1010];int main(){ int n; int kase=0; while (scanf("%d",&n) && n) { T.clear(); for (int i=1; i<=n; i++) { scanf("%s",str); T.insert(str); } T.count(); printf("Case %d: %lld\n",++kase,T.ans); } return 0;}

 

转载于:https://www.cnblogs.com/kkrisen/p/3668777.html

你可能感兴趣的文章
boost 同步定时器
查看>>
[ROS] Chinese MOOC || Chapter-4.4 Action
查看>>
简单的数据库操作
查看>>
iOS-解决iOS8及以上设置applicationIconBadgeNumber报错的问题
查看>>
亡灵序曲-The Dawn
查看>>
Redmine
查看>>
帧的最小长度 CSMA/CD
查看>>
xib文件加载后设置frame无效问题
查看>>
编程算法 - 左旋转字符串 代码(C)
查看>>
IOS解析XML
查看>>
Python3多线程爬取meizitu的图片
查看>>
树状数组及其他特别简单的扩展
查看>>
zookeeper适用场景:分布式锁实现
查看>>
110104_LC-Display(液晶显示屏)
查看>>
httpd_Vhosts文件的配置
查看>>
php学习笔记
查看>>
普通求素数和线性筛素数
查看>>
PHP截取中英文混合字符
查看>>
【洛谷P1816 忠诚】线段树
查看>>
电子眼抓拍大解密
查看>>