UVa11732 Strcmp,Anyone?[Trie树]

2024-01-01 08:08
文章标签 strcmp trie anyone uva11732

本文主要是介绍UVa11732 Strcmp,Anyone?[Trie树],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目1
题目2
题意:给定判断方式和字符串,输出字符串两两比较的次数;
分析:如果使用正常的字典树,空间复杂度为4000*1000*26,果断爆,但我静态数组没有爆反而RE了,不知道为什么,可能UVa没有MLE?等会试一下;然后还会超时,因为每个节点都要枚举,是4000*1000*26*26,,不过机智一点应该不会超时?就每次insert顺便求了。所以,采用树的压缩算法(左孩子右兄弟)。
第一次写多叉转二叉,本来以为会很麻烦,没想到比普通程序还要短一点,所以基本功要练扎实啊,这些都是基础的。
然后就是经验之谈,在明知道不是正解的情况下,尤其是MLE这么一开始就知道的问题,就不要写程序了,免得浪费自己的时间精力和心情。还有就是调试的时候一定要从逻辑入手,数据是弄不完的,太浪费时间了,理一下自己的思路看有哪些特殊情况没有处理,如果还是找不出来问题再自己举特殊例子调。这种类似递推的题一定要把公式的适用情况和逻辑关系理清楚;
程序:

#include<iostream>#include<cstdio>#include<cstring>#define clr(x) memset(x,0,sizeof(x))using namespace std;const int maxn=4000*1000+5;int fr[maxn],tov[maxn],inde,len,n,cnt;
char a[1005],ch[maxn];
long long ans,tot[maxn],sig[maxn];
void init()
{ans=0;inde=0;clr(fr);clr(tov);clr(tot);clr(ch);clr(sig);
}
void build(int u,long long dep)
{ans+=tot[u]*2LL;//ans-=sig[u];if(dep==len){tot[u]++;ans+=sig[u];sig[u]++;return;}tot[u]++;for(int i=fr[u];i;i=tov[i])if(ch[i]==a[dep]){build(i,dep+1);return;}tov[++inde]=fr[u];fr[u]=inde;ch[inde]=a[dep];build(inde,dep+1);
}
int main()
{freopen("UVa11732.in","r",stdin);freopen("Uva11732.out","w",stdout);for(scanf("%d",&n);n;scanf("%d",&n)){init();printf("Case %d: ",++cnt);for(int i=1;i<=n;i++){scanf("%s",a);len=strlen(a);build(0,0);}printf("%lld\n",ans-tot[0]*(tot[0]-1LL)/2LL);}return 0;
}

这篇关于UVa11732 Strcmp,Anyone?[Trie树]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558616

相关文章

Python高效实现Trie(前缀树)及其插入和查找操作

Python高效实现Trie(前缀树)及其插入和查找操作 在Python面试中,考官通常会关注候选人的编程能力、问题解决能力以及对Python语言特性的理解。Trie(前缀树)是一种高效的数据结构,广泛应用于字符串处理、自动补全、拼写检查等场景。本文将详细介绍如何实现一个Trie,并提供插入和查找操作,确保代码实用性强,条理清晰,操作性强。 1. 引言 Trie(前缀树)是一种树形数据结构,

Trie 类型的题目总结

trie字典树可以用来查找单词或者搜索剪枝用。 Implement Trie (Prefix Tree) 实现一个 Trie,包含 insert, search, 和 startsWith 这三个方法。(模板必须记住;没有儿子建立儿子,有儿子走儿子;) class Trie {private class TrieNode {public TrieNode[] children;public b

【Trie树】模板题-POJ-2001

题意: 给你若干个单词,写出能每个单词的最短前缀 也就是说这个前缀能准确代表这个单词,和其他单词 without ambiguity  思路: 建立字典树存下这几个单词,ct 数组记录每个节点的子节点数,显然子树宽度只有1的话,这个单词就被确定了,改造一下我们的 find_word 函数就行啦 哦。。这个结构体要怎么搞还坑了我一下,要向下面那样定义! 代码: #include

Trie树专题

Intro:         为了高效的存储和查找字符串,集合的数据结构。,  板子: /*Trie树 —— 模板题 AcWing 835. Trie字符串统计*/int son[N][26], cnt[N], idx;// 0号点既是根节点,又是空节点// son[][]存储树中每个节点的子节点// cnt[]存储以每个节点结尾的单词数量// 插入一个字符串void insert(

数据结构-非线性结构-树形结构:Trie/字典树/前缀树【专门用于处理字符串类数据】

Trie的代码实现 import java.util.TreeMap;/*** Trie树(前缀树、字典树)** @author whx* @version 2018/9/1*/public class Trie {/*** 节点类** @author whx* @version 2018/9/1*/private class Node{public boolean isWord;publ

Leetcode171: Implement Trie (Prefix Tree)

Implement a trie with insert, search, and startsWith methods. Trie树又被称为字典树、前缀树,是一种用于快速检索的多叉树。Tried树可以利用字符串的公共前缀来节省存储空间。 但如果系统存在大量没有公共前缀的字符串,相应的Trie树将非常消耗内存。 Trie树的基本性质如下: 根节点不包括字符,除根节点外每个节点包括

秋招突击——算法练习——8/26——图论——200-岛屿数量、994-腐烂的橘子、207-课程表、208-实现Trie

文章目录 引言正文200-岛屿数量个人实现 994、腐烂的橘子个人实现参考实现 207、课程表个人实现参考实现 208、实现Trie前缀树个人实现参考实现 总结 引言 正文 200-岛屿数量 题目链接 个人实现 我靠,这道题居然是腾讯一面的类似题,那道题是计算最大的岛屿面积,如果当时没做出来,现在得哭死!好在做出来了!这道题单纯使用回溯实现的,然后修改一下地图的坐标

字典树(trie 树)

Trie树又称字典树,字典查找树。 Trie有三种结构:标准trie 压缩trie 后缀trie。本篇博文主要介绍标准trie 标准 Trie树的结构 : 所有含有公共前缀的字符串将挂在树中同一个结点下。实际上trie简明的存储了存在于串集合中的所有公共前缀。 假如有这样一个字符串集合X{bear,bell,bid,bull,buy,sell,stock,stop}。它的标准Trie树如下图

字符串之strcmp

//字符串之strcmp #include <iostream>#include<assert.h> #include<string.h> using namespace std; int strcmpT(const char * a,const char * b) {     assert(a!=NULL&&b!=NULL);     int ret=0;     whi

比较两个字符串长度,不使用strcmp函数

【描述】  编写一个程序,将两个字符串s1和s2比较,如果s1 > s2,输出一个正数;s1 = s2,输出0,;s1 < s2输出一个负数。不要使用strcmp函数。两个字符串用gets函数读入。输出的正数或者负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值。例如“A”与“C”相比,由于“A” < "C",应该输出负数,由于“A”与"C"的ASCII嘛差值为2,因此应该输出“-2