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

相关文章

AIGC-Animate Anyone阿里的图像到视频 角色合成的框架-论文解读

Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 论文:https://arxiv.org/pdf/2311.17117 网页:https://humanaigc.github.io/animate-anyone/ MOTIVATION 角色动画的

双数组Trie树(DoubleArrayTrie)Java实现

原文地址: http://www.hankcs.com/program/java/%E5%8F%8C%E6%95%B0%E7%BB%84trie%E6%A0%91doublearraytriejava%E5%AE%9E%E7%8E%B0.html 双数组Trie树(DoubleArrayTrie)是一种空间复杂度低的Trie树,应用于字符区间大的语言(如中文、日文等)分词领域。

Trie树进阶:Double-Array Trie原理及状态转移过程详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013761665/article/details/49281865 前言:   Trie树本身就是一个很迷人的数据结构,何况是其改进的方案。   在本博客中我会从DAT(Double-Array Tire)的原理开始,并结合其源代码对DAT的状态转移过程进行解析。如果因此你能从我的博客中有所

trie基本用法

poj2001 poj2503 poj3630poj1056poj1451 1.单词查找树 我们需要将一个确定的单词列表建出一棵单词查找树,满足 1. 根结点不包含字母,除根结点外的每个都仅含一个大写英文 字母; 2. 从根结点到某一结点,路径上经过的字母依次连起来所构成 的字母序列,称为该结点对应的单词。单词列表中的每个词,都是 该单词查找树某个结点所对应的单词; 3. 在满足上述条件下,该

TRIE树在输入法分词的应用

TRIE树,即字典树,可以用于排序、保存大量字符串,在搜索引擎和防火墙中都有着重要的作用。本文使用字典树读取汉语拼音并进行匹配,成功实现了汉语拼音的划分。 先来看看TRIE树的结构: 树从root根节点出发,每个节点都有26个子节点(对应各个字母)。不难发现所有n长度的单词组合都在高度为n的TRIE树中。我们把从root节点出发,到某叶子(或节点)的字母组合称为一个单词。 1.定义

Trie树入门:HDU 1671

题意:就是每个串中如果有其他串是它的子串,则输出NO,否则输入YES。 思路:第一点:刚开始……唉……说多了都是泪啊……先前做了1251,然后里面的是s[i]-'a'算的,然后这题是s[i]-'0',就在这卡了1个半小时,一直RE,郁闷死!!用VS调试了,然后调试竟然对,真是奇了。错的代码,数组下标都是负数了竟然还运行正确……嘛嘛的,让我都不知道哪里错了,搞了好久才知道是算字母时错了。 第二点

Trie树入门:HDU 1251

这题搞了几个小时,从昨天看题目然后从刘汝佳那本训练指导中看了Trie树的插入模板,然后就想这题怎么查找,然后今早竟然做了卡了好久,因为书中是给二维数组的,而这题无限输入啊,直到文件结束,我就在想用vector代替数组,但是实行起来出错了。然后又用map代替,样例对了,可是提交还是错了。然后又换成二维数组,上线从4000000一直提交直降到400000才没有内存超出,可是还是wrong了,再在没有内

Trie字典树和AC自动机(题目)

A. 三年二班的投票 题目描述: 三年级二班已经完成了竞选班长的投票,已知一共有 n 张投票,每张投票上写了一位同学的名字。 投票统计结束后,张老师随意问一个同学的名字,请编程快速检索出,该同学共有几票。 输入: 第一行读入一个整数 n ,代表产生了 n 张投票。( n≤10^5 ) 接下来 n 行,每行有一个字符串 s ,代表该张投票上写的同学的姓名(姓名由不含空格的小写英文字母组成

UVA - 11732 strcmp() Anyone?

题意:题目给出了标准strcmp()函数的代码,给你n个单词(n  <= 4000, len <= 1000, 大小写字母+数字),问你这些单词两两调用strcmp()函数一共比较了多少次 思路:字符串S1,S2比较分两种情况:S1和S2有相同的前缀S,那么ans = len(S)*2+1; S1和S2完全相同的话:ans = (len(S)+1) * 2,等于算上了‘\0’ 然后按照Tri

UVALive - 3942 Remember the Word (Trie)

题意:给你一个有S个不同单词组成的字典和一个长字符串,把这个字符串分解成若干个单词的连接,有多少种方法 思路:转化为Trie树的形式储存,用d(i)表示字符从i开始的字符串的分解方案,每次搜索到一个单词末的时候就可以累加了 #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>const