传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2832

题目大意:

给定strcmp实现如下:

int strcmp(char *s, char *t)
{
int i;
for (i=0; s[i]==t[i]; i++)
if (s[i]=='\0')
return 0;
return s[i] - t[i];
}

给定n个字符串,若两两比较一次,需要比较多少次?如that和than需要7次

大牛都去比赛了。渣渣只好继续敲代码练习。QAQ

第一次写左儿子右兄弟表示法,基本上参考大神的。

#include<cstdio>
#include<cstring>
const int MAXN = 4000 * 1000 + 10;
const int MAXLEN = 26;
char word[1024];
struct Trie
{
int son[MAXN]; // 第i个结点的左儿子编号
int brother[MAXN]; // 第i个结点的右兄弟编号
char ch[MAXN]; // 为第i个结点上的字符
int tot[MAXN]; // 第i个结点为根的子树包含的叶结点总数
int flag[MAXN]; //相同字符串的个数
int sz; // 结点总数
long long ans;
void init() { sz=1; ans=0; tot[0] = son[0] = brother[0] = flag[0] = 0; }
void insert(char *s)
{
ans+=tot[0]; //每插入一个总要和头结点比较
tot[0]++;
int len=strlen(s);
int u=0,v;
for(int i=0;i<len;i++)
{
bool find=false;
for(v=son[u];v!=0;v=brother[v])
if(ch[v]==s[i])
{
find=true;
break;
} if(!find)
{
v=sz++;
tot[v]=0;
flag[v]=0;
ch[v]=s[i];
brother[v]=son[u];
son[u]=v; //插入头部
son[v]=0;
} u=v;
ans=ans+tot[u]*2; //需要比较相等和不是'\0'
tot[u]++;
}
if(flag[v])ans+=flag[v];//统计相同字符串的个数
flag[v]++;
}
}trie; int main()
{
int kase = 1;
int n;
while(scanf("%d", &n) && n)
{
trie.init();
for(int i = 0; i < n; i++)
{
scanf("%s", word);
trie.insert(word);
}
printf("Case %d: %lld\n", kase++, trie.ans);
}
return 0;
}

UVA 11732 - strcmp() Anyone? 字典树的更多相关文章

  1. UVA 11732 - strcmp() Anyone?(Trie)

    UVA 11732 - strcmp() Anyone? 题目链接 题意:给定一些字符串,要求两两比較,须要比較的总次数(注意.假设一个字符同样.实际上要还要和'\0'比一次,相当比2次) 思路:建T ...

  2. 左儿子右兄弟Trie UVA 11732 strcmp() Anyone?

    题目地址: option=com_onlinejudge&Itemid=8&category=117&page=show_problem&problem=2832&qu ...

  3. UVA 11732 strcmp() Anyone? (压缩版字典树)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  4. Uva 11732 strcmp()函数

    题目链接:https://vjudge.net/contest/158125#problem/A 题意: 系统中,strcmp函数是这样执行的,给定 n 个字符串,求两两比较时,strcmp函数要比较 ...

  5. UVA Phone List (字典树)(查询是否有前缀或自身是其他的前缀)

    Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16341   Accepted: 5228 Descr ...

  6. UVa 11732 "strcmp()" Anyone? (左儿子右兄弟前缀树Trie)

    题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php? ...

  7. uva 1519 - Dictionary Size(字典树)

    题目链接:uva 1519 - Dictionary Size 题目大意:给出n个字符串组成的字典.如今要加入新的单词,从已有单词中选出非空前缀和非空后缀,组成新单词. 问说能组成多少个单词. 解题思 ...

  8. UVA - 11732 "strcmp()" Anyone? (trie)

    https://vjudge.net/problem/UVA-11732 题意 给定n个字符串,问用strcmp函数比较这些字符串共用多少次比较. strcmp函数的实现 int strcmp(cha ...

  9. Uva 11732 strcmp() Anyone?

    strcmp() Anyone? Time Limit: 2000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Subm ...

随机推荐

  1. Easy mock - 安装配置和基本使用

    Easy-mock easy-mock是一款比较好用的接口模拟工具, 使用之前我们需要安装和配置 需要下载的内容有以下 Node Redis MongoDB Node和Redis一路点下一步就行, M ...

  2. 压状态bfs

    一般地图很小,状态不多,可以装压或者hash,构造压缩或hash的函数,构造还原地图的函数,然后就无脑bfs(感觉就是SPFA) 题目: 1.玩具游戏:二进制压缩状态 #include<cstd ...

  3. STL中erase()的陷阱

    最近在刷stl源码剖析这本书时,对于vector的erase()函数引起了我的注意 在删除单个元素时是这样定义的: iterator erase(iterator position){ !=end() ...

  4. JavaScript学习总结(6)——js弹出框、对话框、提示框、弹窗总结

    一.JS的三种最常见的对话框 [javascript] view plaincopy //====================== JS最常用三种弹出对话框 =================== ...

  5. C++ 指针与引用 知识点 小结

    [摘要] 指针能够指向变量.数组.字符串.函数.甚至结构体.即指针能够指向不同数据对象.指针问题 包含 常量指针.数组指针.函数指针.this指针.指针传值.指向指针的指针 等. 主要知识点包含:1. ...

  6. cocos2d-x嵌入移动MM短代支付IAP2.4的SDK,点击支付崩溃的解决的方法

    凡是用IAP2.4,调用purchase.order 游戏崩溃.logcat报错是: 06-16 18:43:42.944: E/AndroidRuntime(8526): FATAL EXCEPTI ...

  7. Activity启动过程源代码分析

    事实上写分析源代码文章总会显得非常复杂非常乏味,可是梳理自己看源代码时的一些总结也是一种提高. 这篇博客分析下Activity启动过程源代码,我会尽量说得简单点. 个人的观点是看源代码不能看得太细,否 ...

  8. 【Tomcat】严重: Context [/grouponAdminWeb] startup failed due to previous errors

    1 tomcat 6600启动报错[root@localhost webapps]#     sh /usr/local/apache-tomcat-6.0.37_6600/bin/startup.s ...

  9. COOKIE传值

    1.遍历所有cookie foreach (string  _key in Request.Cookies.AllKeys)//遍历主键            {                Htt ...

  10. JQuery滑动到指定位置

    $('html, body').animate({ scrollTop: next_tip.offset().top + "px"},500);