UVA 11732 - strcmp() Anyone?(Trie)
2016-04-18 12:42
423 查看
UVA 11732 - strcmp() Anyone?
题目链接题意:给定一些字符串,要求两两比較,须要比較的总次数(注意。假设一个字符同样。实际上要还要和'\0'比一次,相当比2次)
思路:建Trie树,每次建树过程中。后继后继结点就是同样结点须要比較两次ans + val * 2。否则就是不同结点ans + val,建完树就计算完了
代码:
#include <cstdio> #include <cstring> const int N = 1005; const int MAXN = 4000005; int n; char str ; long long ans; struct Node { char c; int val; } node[MAXN]; int first[MAXN], next[MAXN], sz; void init() { ans = 0; sz = 1; first[0] = 0; next[0] = 0; node[0].val = 0; } void insert(char *str) { int u = 0, len = strlen(str); for (int i = 0; i <= len; i++) { bool flag = true; int v, tmp; for (v = first[u]; v; v = next[v]) { if (node[v].c == str[i]) { tmp = v; flag = false; ans += node[v].val * 2; } else ans += node[v].val; } if (flag) { v = sz++; node[v].c = str[i]; node[v].val = 0; first[v] = 0; next[v] = first[u]; first[u] = v; } else v = tmp; u = v; node[u].val++; } } int main() { int cas = 0; while (~scanf("%d", &n) && n) { init(); while (n--) { scanf("%s", str); insert(str); } printf("Case %d: %lld\n", ++cas, ans); } return 0; }
相关文章推荐
- 学习JAVA之路(六、数组)
- Druid基本使用配置以及如何查看sql信息监控日志
- 博客收藏地址
- 【Spring实战】—— 12 AspectJ报错:error at ::0 can't find referenced pointcut XXX
- ora-00845
- ETL利器Kettle实战应用解析系列一【Kettle使用介绍】
- c++文件流操作
- Android Studio安装配置详细步骤(图文)
- Java入门(一)
- Java学习笔记
- Opencv头文件记要~
- Canvas开发笔记(不断更新)
- mxnet:结合R与GPU加速深度学习(转)
- 签到题 2016.4.18
- watch(),$digest()和$apply()
- 下周二推出“音视频技术WebRTC初探”公开课,欢迎捧场!
- ios 关于如何设置注册登录验证码、正则表达式
- 关于PHP的!
- linux常用命令-搜索
- win7安装virtualbox遇到的问题