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函数要比较 ...
随机推荐
- charles关于手机APP抓包
这里相比其他抓包软件来说要简单的多了,具体步骤如下: 1 使手机和电脑在一个局域网内,不一定非要是一个ip段,只要是同一个漏油器下就可以了,比如电脑连接的有线网ip为192.168.16.12,然后手 ...
- JEECMS-新闻内容中遍历批量上传的图片
[#list content.pictures as p] <li value="${p_index+1}"> <img src="${p.imgPat ...
- ue4 模拟tween
timeline的设置,注意timeLine可以使用外部的曲线,这个比较方便做各种曲线,timeline内部只适合打单个点
- 2017-9-13 NOIP模拟赛[xxy]
全排列 (permutation.cpp/c/pas)Description从 n 个不同元素中任取 m(m≤n)个元素,按照一定的顺序排列起来,叫做从 n个不同元素中取出 m 个元素的一个排列.当 ...
- 获取URL地址栏参数(正则表达式)
]] = isEncode ? decodeURIComponent(arg[2]) : arg[2]; }); return obj;}
- ajax对象。同步与异步及ajax发送请求
ajax对象的属性.方法 属性 readyState: Ajax状态码 * 0:表示对象已建立,但未初始化,只是 new 成功获取了对象,但是未调用open方法 1:表示对象已初始化,但未发送,调用了 ...
- HTML5新标签介绍
一.Datalist 标签 <input list="browsers"> <datalist id="browsers"> < ...
- PostgreSQL - raise函数打印字符串
raise函数 在PostgreSQL中,该函数用于打印字符串,类似于Java中的System.out.println(),Oracle中的dbms_output.put_line(). 用法如下: ...
- python序列化模块 json&&pickle&&shelve
#序列化模块 #what #什么叫序列化--将原本的字典.列表等内容转换成一个字符串的过程叫做序列化. #why #序列化的目的 ##1.以某种存储形式使自定义对象持久化 ##2.将对象从一个地方传递 ...
- [TCP/IP]ICMP和IGMP的区别
ICMP(Internet 控制消息协议,Internet Control Message Protocol)协议用来给IP协议提供控制服务,允许路由器或目标主机给数据的发送方提供反馈信息.需要发送反 ...