UVA 11732 strcmp() Anyone (Trie+链表)
先两两比较,比较次数是两者相同的最长前缀长度*2+1,比较特殊的情况是两者完全相同时候比较次数是单词长度*2+2,
两个单词'末尾\0'和'\0'比较一次,s尾部'\0'和循环内'\0'比较一次。
因此,对于一个单词,只要知道和它某个相同的最长前缀的单词数就可以计算出方案数了。
用tire,记录一颗子树上的结点数cnt[u](用于计算当前前缀是最长前缀的单词数)和在某个结点终止的单词数val[u](处理特殊情况)。
因为字符集比较大,可能会有较大的空间浪费,所以用一个链式的结构保存子节点。(查找子节点的时候效率会低一些)。
如果插完了以后再统计的话一个前缀会被算2次,要除以2。
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int maxnds = *+;
- char ch[maxnds];//用来保存结点的字符值
- int cnt[maxnds];
- int son[maxnds],bro[maxnds]; //son是链表头,bro[u]表示u的下一个兄弟结点
- int val[maxnds];
- int nds;//nds是下一个可以分配的结点
- void init()
- {
- nds = ; cnt[] = son[] = val[] = ;
- }
- ll add(char *s)
- {
- ll ret = ;
- int u = ,v,i;
- for(i = ; s[i]; i++){
- for(v = son[u]; v; v = bro[v]){
- if(ch[v] == s[i]) break;
- }
- if(!v){
- //初始化新结点
- bro[nds] = son[u];
- ch[nds] = s[i];
- val[nds] = cnt[nds] = son[nds] = ;
- //把新结点插到链表头,并分配下一个结点
- v = son[u] = nds++;
- }
- ret += (cnt[u]-cnt[v])*(i<<|);
- cnt[u]++;
- u = v;
- }
- if(val[u]) ret += val[u]*((i+)<<);
- ret += (cnt[u]-val[u])*(i<<|);
- cnt[u]++; val[u]++;
- return ret;
- }
- char str[];
- int main()
- {
- //freopen("in.txt","r",stdin);
- int N,kas = ;
- while(scanf("%d\n",&N),N){
- ll ans = ;
- init();
- while(N--){
- gets(str);
- ans += add(str);
- }
- printf("Case %d: %lld\n",++kas,ans);
- }
- return ;
- }
UVA 11732 strcmp() Anyone (Trie+链表)的更多相关文章
- 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的性质)
strcmp() Anyone? strcmp() is a library function in C/C++ which compares two strings. It takes two st ...
- UVA - 11732 "strcmp()" Anyone? (trie)
https://vjudge.net/problem/UVA-11732 题意 给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. strcmp函数的实现 int strcmp(cha ...
- Trie UVA 11732 "strcmp()" Anyone?
题目传送门 题意:询问所有字符串的比较次数和(注意for循环内的比较也算) 分析:将所有字符串插入到字典树上,然后结点信息记录有几个字符串,那么每走到一个结点就能知道比较到此时需要的次数.学习到链表存 ...
- 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题
题解:http://blog.csdn.net/u013480600/article/details/23122503 我的代码一直TLE,,,看了人家的之后,认为1.链式前向星比較好,2.*dept ...
- Uva 11732 strcmp()函数
题目链接:https://vjudge.net/contest/158125#problem/A 题意: 系统中,strcmp函数是这样执行的,给定 n 个字符串,求两两比较时,strcmp函数要比较 ...
随机推荐
- BDBR vs BDPSNR 计算方法 (转载)
转自:http://blog.csdn.net/menyangyang/article/details/42874575
- es6 reduce的用法
一.forEach回调函数参数,item(数组元素).index(序列).arr(数组本身)循环数组,无返回值,不改变原数组不支持return操作输出,return只用于控制循环是否跳出当前循环 二. ...
- 【JOI Camp 2015】IOIO卡片占卜——最短路
题目 [题目描述]K 理事长是占卜好手,他精通各种形式的占卜.今天,他要用正面写着 `I` ,背面写着 `O` 的卡片占卜一下日本 IOI 国家队的选手选择情况.占卜的方法如下:1. 首先,选取五个正 ...
- JDK12下的ArrayList源码解读 与 Vector的对比
ArrayList源码阅读. //测试代码实现如下 private static void arrayList() { ArrayList<String> list = new Array ...
- C 语言实例 - 一元二次方程
C 语言实例 - 一元二次方程 求一元二次方程:ax2+bx+c= 的根. 输入三个实数a,b,c的值,且a不等于0. 实例 #include <stdio.h> #include < ...
- this真题编译
1 x y z分别输出的是什么? var x=1, y=z=0; function add(n){ return n= n+1; }; y=add(x); function add(n){ retu ...
- input 内容发生改变时触发事件
oninput,onpropertychange,onchange的用法 onchange触发事件必须满足两个条件: a)当前对象属性改变,并且是由键盘或鼠标事件激发的(脚本触发无效) b)当前对象失 ...
- vue-cli搭建项目及代理路由设置
vue-cli 是vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一. 安装 node ...
- Zookeeper+websocket实现对分布式服务器的实时监控(附源码下载)
我就是个封面 Zookeeper简介 Zookeeper是Hadoop的一个子项目,它是分布式系统中的协调系统. 简单来说就是一个Zookeeper注册同步中心,内部结构为一个树形目录,每个节点上 ...
- Eclipse启动SDK Manager报错:[SDK Manager] 'xcopy' 不是内部或外部命令,也不是可运行的程序。
解决方法,在path环境变量下加上C:\WINDOWS\system32;或将C:\WINDOWS\system32\xcopy.exe拷贝到android sdk目录的tools下面即可正常运行.