UVA 11732——Trie
解题思路:
首先我们可以发现:
1.若两个字符串A、B不相等,且它们的公共前缀为S,则它们的比较次数为:2 * len(S) + 1;
2.若两个字符串相等,设为A,则它们的比较次数为 2 * ( len(A) + 1 ) //注意考虑结束符'\0'
那么我们可以建立前缀树,在向前缀树中插入字符串的过程中,如果遇到分叉结点则需要进行比较。
特别注意:"aaaa","aa"以及"aaaa","aaaa"的情况
具体做法:
Trie维护每个结点的val和flag,其中val表示经过每个结点的字符串个数,flag表示是否是分叉结点。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std; const int maxnode = * + ;
const int _size = ;
long long ans; struct Trie {
int ch[maxnode][_size];
int val[maxnode];
int flag[maxnode];
int sz;
Trie() {
sz = ;
memset(ch[], , sizeof (ch[]));
}
int idx(int c) {
if(c == '\0') return ;
else if(isdigit(c)) return c - '';
else if(c >= 'A' && c <= 'Z') return c - 'A' + ;
else return c - 'a' + ;
} void insert(char *s) {
int u = , n = strlen(s);
val[u]++;
int i;
for(i = ; i <= n; i++) {
int c = idx(s[i]);
if(!ch[u][c]) {
memset(ch[sz], , sizeof (ch[sz]));
ch[u][c] = sz++;
val[ch[u][c]] = ;
if(val[u] > ){
flag[u] = ;
ans += (*i+) * (val[u]-val[ch[u][c]]);
}
}
else {
val[ch[u][c]]++;
if(flag[u]) ans += (*i+) * (val[u]-val[ch[u][c]]);
}
u = ch[u][c]; }
if(val[u] > ) {
flag[u] = ;
ans += (*i) * (val[u]-);
}
} void clear() {
sz = ;
memset(val, , sizeof val);
memset(ch[], , sizeof (ch[]));
memset(flag, , sizeof flag);
}
}; char s[];
Trie T; int main(int argc, const char * argv[]) { int n;
int kase = ;
while(scanf("%d", &n) == && n) {
T.clear();
ans = ;
for(int i = ; i < n; i++) {
scanf("%s", s);
T.insert(s);
} printf("Case %d: %lld\n", kase++, ans);
}
return ;
}
UVA 11732——Trie的更多相关文章
- uva 11732 (trie树)
题意:求N个字符串两两比较,共比较了多少次? #include<iostream> #include<cstring> #include<cstdio> using ...
- UVA 11732 - strcmp() Anyone?(Trie)
UVA 11732 - strcmp() Anyone? 题目链接 题意:给定一些字符串,要求两两比較,须要比較的总次数(注意.假设一个字符同样.实际上要还要和'\0'比一次,相当比2次) 思路:建T ...
- 左儿子右兄弟Trie UVA 11732 strcmp() Anyone?
题目地址: option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2832&qu ...
- UVa 11732 "strcmp()" Anyone? (左儿子右兄弟前缀树Trie)
题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php? ...
- UVA 11732 "strcmp()" Anyone? (Trie)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- Trie UVA 11732 "strcmp()" Anyone?
题目传送门 题意:询问所有字符串的比较次数和(注意for循环内的比较也算) 分析:将所有字符串插入到字典树上,然后结点信息记录有几个字符串,那么每走到一个结点就能知道比较到此时需要的次数.学习到链表存 ...
- UVA 11732 strcmp() Anyone?(Trie的性质)
strcmp() Anyone? strcmp() is a library function in C/C++ which compares two strings. It takes two st ...
- uva 11732 - strcmp() Anyone? 不错的Trie题
题解:http://blog.csdn.net/u013480600/article/details/23122503 我的代码一直TLE,,,看了人家的之后,认为1.链式前向星比較好,2.*dept ...
- UVA - 11732 "strcmp()" Anyone?左兄弟右儿子trie
input n 2<=n<=4000 s1 s2 ... sn 1<=len(si)<=1000 output 输出用strcmp()两两比较si,sj(i!=j)要比较的次数 ...
随机推荐
- HTML5小知识汇总
1.关于<!DOCTYPE HTML> H5只需要<!DOCTYPE HTML>这样简单的声明,不用之前一长串代码,因为H5不是基于SGML,所以不需要对DTD引用,但是需要D ...
- python 对位运算
- python ndarray相关操作:转置、翻转
- oracle-OFA模型
用于unix文件系统和安装点的命名约定 用于目录路径的命名约定 用于数据文件的命名约定 用于oracle相关文件的标准位置
- 大数据心法来了!一站式玩转MaxCompute,还有开发者资源等你领!
阿里云大数据计算平台开发者版2019年3月推出,MaxCompute正在成为开发者的免费大数据平台.今天,MaxCompute在企业构建自己的数据处理平台实践中起到了至关重要的作用,我们特别精选了企业 ...
- DTcms iis6 伪静态 iis配置方法 【图解】
1.右键点击 要设置网站的网站 2.属性 ——>主目录 ——>配置——> 3.如右侧窗口,找到 .aspx 扩展名——>编辑——>复制 可执行文件的路径——>关闭 ...
- git day01笔记 常用操作命令 快照 推送 拉取
ansible 批量在远程主机上执行命令或者脚本 git 做版本控制的一个工具 ## git操作命令: 工作区:当前编辑的区域 缓存区:add 之后的区域 本地仓库:commit之后的区域 远程仓 ...
- springboot security 安全
spring security几个概念 “认证”(Authentication) 是建立一个他声明的主体的过程(一个“主体”一般是指用户,设备或一些可以在你的应用程序中执行动作的其他系统) . “授权 ...
- Asterisk 代码架构概述
from:http://blog.csdn.net/yetyongjin/article/details/7594447 近日分析Asterisk 1.8源码.Asterisk trunk上有这篇架构 ...
- No.1 Verilog HDL简介
硬件描述语言HDL(Hardware Description Language)是一种用形式化方法来描述数字电路和系统的语言.设计者利用HDL可以从抽象到具体逐层描述自己的设计思想,用一系列的分 ...