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)要比较的次数 ...
随机推荐
- Leetcode917.Reverse Only Letters仅仅反转字母
给定一个字符串 S,返回 "反转后的" 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转. 示例 1: 输入:"ab-cd" 输出:" ...
- 【水滴石穿】React-Redux-Demo
这个项目没有使用什么组件,可以理解就是个redux项目 项目地址为:https://github.com/HuPingKang/React-Redux-Demo 先看效果图 点击颜色字体颜色改变,以及 ...
- JavaScript-- 函数既是函数又是对象
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【转载】【软件安装】Source Insight 4.0常用设置
1.Source Insight简介 Source Insight是一个面向软件开发的代码编辑器和浏览器,它拥有内置的对C/C++, C#和Java等源码的分析,创建并动态维护符号数据库,并自动显示有 ...
- getElementsByClassName兼容低版本浏览器
var getElementsByClassName = function (searchClass, node,tag) { if(document.getElementsByClassName){ ...
- PLAY2.6-SCALA(八) comet
Comet是指基于 HTTP 长连接的“服务器推”技术,是一种不需要客户端主动请求,服务端可以主动给客户端推送消息的技术. 1.使用chunked response来实现Comet chunked r ...
- ipad模拟器iPadian.exe
http://dl.pconline.com.cn/download/368140.html 苹果IPAD模拟器!让你的电脑立刻拥有IOS系统!马上变成ipad!几百个免费的扩展应用程序,能登QQ,微 ...
- vue页面内监听路由变化
beforeRouteEnter (to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `this` // 因为当钩子执行前,组件实 ...
- LeetCode69 Sqrt(x)
题意: Implement int sqrt(int x). Compute and return the square root of x.(Medium) 分析: 二分搜索套路题,不能开方开尽的时 ...
- How To Move Or Rebuild A Lob Partition
How To Move Or Rebuild A Lob Partition [ID 761388.1] 改动时间 29-JUN-2010 类型 HOWTO 状 ...