Trie UVA 11732 "strcmp()" Anyone?
题意:询问所有字符串的比较次数和(注意for循环内的比较也算)
分析:将所有字符串插入到字典树上,然后结点信息记录有几个字符串,那么每走到一个结点就能知道比较到此时需要的次数。学习到链表存结点
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = 4e3 + 5;
const int M = 1e3 + 5;
const int NODE = N * M;
struct Trie {
int head[NODE], nex[NODE];
char ch[NODE];
int cnt[NODE];
int sz;
void clear() {
sz = 1; cnt[0] = head[0] = nex[0] = 0;
}
void insert(char *str) {
int u = 0, len = strlen (str);
cnt[0]++;
for (int i=0; i<=len; ++i) {
bool found = false;
int v;
for (v=head[u]; v; v=nex[v]) {
if (ch[v] == str[i]) {
found = true; break;
}
}
if (!found) { //插入到链表的头结点后一个
v = sz++;
cnt[v] = 0;
ch[v] = str[i];
nex[v] = head[u];
head[u] = v;
head[v] = 0;
}
u = v; cnt[u]++;
}
}
void query(int u, int dep, ll &res) {
if (!head[u]) {
res += cnt[u] * (cnt[u] - 1) * dep;
return ;
}
int sum = 0, tmp = cnt[u];
for (int v=head[u]; v; v=nex[v]) {
//sum += cnt[v] * (cnt[u] - cnt[v]);
res += cnt[v] * (tmp - cnt[v]) * (dep * 2 + 1);
tmp -= cnt[v];
}
//res += sum / 2 * (2 * dep + 1);
for (int v=head[u]; v; v=nex[v]) {
query (v, dep + 1, res);
}
}
}trie;
char word[M]; int main(void) {
int n, cas = 0;
while (scanf ("%d", &n) == 1) {
if (!n) break;
trie.clear ();
for (int i=0; i<n; ++i) {
scanf ("%s", &word);
trie.insert (word);
}
ll ans = 0;
trie.query (0, 0, ans);
printf ("Case %d: %lld\n", ++cas, ans);
} return 0;
}
Trie UVA 11732 "strcmp()" Anyone?的更多相关文章
- 左儿子右兄弟Trie UVA 11732 strcmp() Anyone?
题目地址: option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2832&qu ...
- UVA 11732 - strcmp() Anyone?(Trie)
UVA 11732 - strcmp() Anyone? 题目链接 题意:给定一些字符串,要求两两比較,须要比較的总次数(注意.假设一个字符同样.实际上要还要和'\0'比一次,相当比2次) 思路:建T ...
- UVa 11732 "strcmp()" Anyone? (左儿子右兄弟前缀树Trie)
题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php? ...
- 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
input n 2<=n<=4000 s1 s2 ... sn 1<=len(si)<=1000 output 输出用strcmp()两两比较si,sj(i!=j)要比较的次数 ...
- UVA - 11732 "strcmp()" Anyone? (trie)
https://vjudge.net/problem/UVA-11732 题意 给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. strcmp函数的实现 int strcmp(cha ...
- uva 11732 - strcmp() Anyone? 不错的Trie题
题解:http://blog.csdn.net/u013480600/article/details/23122503 我的代码一直TLE,,,看了人家的之后,认为1.链式前向星比較好,2.*dept ...
- UVA 11732 strcmp() Anyone (Trie+链表)
先两两比较,比较次数是两者相同的最长前缀长度*2+1,比较特殊的情况是两者完全相同时候比较次数是单词长度*2+2, 两个单词'末尾\0'和'\0'比较一次,s尾部'\0'和循环内'\0'比较一次. 因 ...
- UVA 11732 - strcmp() Anyone? 字典树
传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
随机推荐
- iOS 本人必装插件
本人觉得比较好用也实用的Xcode插件记录: 1. Alcatraz 插件通过它来管理 : https://github.com/alcatraz/Alcatraz.git 2. Cocoa ...
- Linux iostat字段解析
iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间来获得 ...
- Linux mpstat字段解析
mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPUs系统里,其不但能查看所有 ...
- 你缺什么(codevs 2928)
2928 你缺什么 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 继“你幸福吗”之后,央视又推出了“ ...
- 1.1 STL 概述
综述 STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R M ...
- Sample Apps by Android Team -- Amazed
Sample Apps by Android Team 代码下载:http://pan.baidu.com/s/1eSNmdUE , 代码原地址:https://code.google.com/arc ...
- Java代码实现excel数据导入到Oracle
1.首先需要两个jar包jxl.jar,ojdbc.jar(注意版本,版本不合适会报版本错误)2.代码: Java代码 import java.io.File; import java.io.Fi ...
- Unreal Engine4 学习笔记2 动画蒙太奇
动画蒙太奇出现的位置是在动画蓝图的动画图表和事件图表中,如下图 事件图表,可以看出在主线执行的结尾,如果is Punching 为true,则会执行一个我们自定义的Punch Event,用来播放动画 ...
- document.location.reload();与location.href='xxx'的区别
document.location.reload();会重新加载页面,onload事件会被触发. location.href='xxx'刷新页面,onload事件不会触发.
- mac下php开发环境搭建+CI框架使用
一.启动apache: apachectl start 停止: apachectl stop 配置文件: vi /etc/apache2/httpd.conf 一.修改端口 因为80端口不想被占用,8 ...