单词

UOJ #492. 单词游戏

我是研究僧i 提交于 2019-11-26 21:21:40
题目描述 有 N 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词。你需要给这些盘子安排一个合适的顺序,使得相邻两个盘子中,前一个盘子上单词的末字母等于后一个盘子上单词的首字母。请你编写一个程序,判断是否能达到这一要求。如果能,请给出一个合适的顺序。 输入描述 多组数据。第一行给出数据组数T,每组数据第一行给出盘子数量N,接下去N行给出小写字母字符串,一种字符串可能出现多次。 输出描述 若存在一组合法解输出“Ordering is possible.”,否则输出“The door cannot be opened.”。 样例输入 3 2 acm ibm 3 acm malform mouse 2 ok ok 样例输出 The door cannot be opened. Ordering is possible. The door cannot be opened. 时间限制、数据范围及描述 时间:1s 空间:64M 1<=N<=10^5; |S|<=1000 思路: 每一个单词有用的信息只有首尾两个字母,那么建一张图令节点表示小写字母;边表示一种单词的转移。问题就变成了在图中判断欧拉路径的存在性。 若有向图G存在欧拉路径(即为半欧拉图),那么当且仅当G的基图联通且存在顶点uu的入度比出度大1,vv的入度比出度小1,其他所有顶点的入度等于出度。 代码: #include

【洛谷】P1101 单词方阵(深搜 or 暴力模拟)题解

半城伤御伤魂 提交于 2019-11-26 17:41:42
原题链接: https://www.luogu.org/problem/P1101 题目描述 给一n × n的字母方阵,内可能蕴含多个“ yizhong ”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用“ * ”代替,以突出显示单词。例如: 输入: 8 输出: qyizhong *yizhong gydthkjy gy****** nwidghji n*i***** orbzsfgz o**z**** hhgrhwth h***h*** zzzzzozo z****o** iwdfrgng i*****n* yyyygggg y******g 输入输出格式 输入格式: 第一行输入一个数n。(7≤ n ≤100)。 第二行开始输入n × n的字母矩阵。 输出格式: 突出显示单词的n × n矩阵。 输入输出样例 输入样例#1: 7 aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa 输出样例#1: ******* ******* ******* ******* ******* ******* ******* 输入样例#2: 8 qyizhong gydthkjy nwidghji orbzsfgz

HDU 1251 统计难题

谁说胖子不能爱 提交于 2019-11-26 16:01:21
- HDU 1251 - 统计难题 ime Limit: 4000/2000 MS (Java/Others) | Memory Limit: 131070/65535 K (Java/Others) 题意: 给出一张单词表,每行一个单词,单词的长度不超过10 (只有小写字母组成,不会有重复的单词出现),要求统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). 注意:本题只有一组测试数据,处理到文件结束. 数据范围: 单词的长度不超过10 解题思路: map函数 字典树 刚开始做这题的时候其实是被它的输入问题給卡住了,因为这题是通过一个 空行 来划分单词表和问题的,但我总是不能准确地作出判断来划分,后来看了 discuss 得知了一些判断方法。 这道题是我用 map 函数和字典树做的第一道题,可以说是我了解并初步学会使用 map 函数和字典树的入门题吧,值得纪念O(∩_∩)O~ 代码: ① map函数: Exe.Time : 764MS | Exe.Memory : 22532K # include <iostream> # include <cstdio> # include <algorithm> # include <map> # include <cstring> using namespace std ; map < string , int > mp ;

Cezar——C++

自作多情 提交于 2019-11-26 14:04:44
描述 Mirko有一组N个不同的单词,他想用替换密码加密。我们通过首先选择一个密钥(一种26个英语字母的排列)来加密使用替换密码的文本。然后我们用密钥的第一个字母替换所有出现的字母'a',所有出现的字母'b'都替换为密钥的第二个字母,依此类推,直到字母'z'。 除了这些词之外,Mirko还有一个数组A,它由1到N的数字组成,按照一定的顺序给出(换句话说,数组A是从1到N的一个排列)。Mirko想要选择一个密钥,使加密和并按照字典序排序后的单词数组对应于数组A。更准确地说,他希望最初位于Ai位置的单词在加密并按字典序排序后位于i位置。 让我们回想一下,字典序是单词出现在字典中的顺序。如果我们比较两个单词,从左到右,我们找到两个单词第一个字母不同的位置,并且基于此,我们确定哪个单词在字典上更小。如果单词X是单词Y的前缀,则视为单词X字典序小于单词Y。 Mirko目前没有加密的心情,所以他恳请你为他做这件事。 输入 第一行输入包含整数N(2≤N≤100)。表示单词的个数。接下来N行每行包含一个单词,由最多100个小写英文字母组成。这些单词是互不相同的。最后一行包含N个整数。表示数组A。 输出 在不存在解决方案的情况下,输出“NE”。否则,在第一行输出“DA”,在第二行输出由26个不同小写字母组成的字符串,即密钥。如果存在多个解决方案,则输出任意一个。 分数分布 对于30%的数据

leetcode-1048 最长字符串链

寵の児 提交于 2019-11-26 12:13:31
leetcode-1048 最长字符串链 参考: doudoucao 题目描述: 给出一个单词列表,其中每个单词都由小写英文字母组成。如果我们可以在 word1 的任何地方添加一个字母使其变成 word2,那么我们认为 word1 是 word2 的前身。例如,"abc" 是 "abac" 的前身。词链是单词 [word_1, word_2, ..., word_k] 组成的序列,k >= 1,其中 word_1 是 word_2 的前身,word_2 是 word_3 的前身,依此类推。从给定单词列表 words 中选择单词组成词链,返回词链的最长可能长度 注:在评论区看到这个做法,真的是太强了 from collections import defaultdict class Solution: def longestStrChain(self, words: List[str]) -> int: words.sort(key=len) res = defaultdict(int) for word in words: res[word]=max(res[word[:i]+word[i+1:]] for i in range(len(word))) + 1 return max(res.values()) 来源: https://www.cnblogs.com

Trie Tree字典树(讲解+模板)

偶尔善良 提交于 2019-11-25 19:42:24
一、引入 字典是干啥的?查找字的。 字典树自然也是起查找作用的。查找的是啥?单词。 看以下几个题: 1、给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单词表中出现过。 答:简单!map,短小精悍。 好。下一个 2、给出n个单词和m个询问,每次询问一个前缀,回答询问是多少个单词的前缀。 答:map,把每个单词拆开。 judge:n<=200000,TLE! 这就需要一种高级数据结构——Trie树(字典树) 二、原理 在本篇文章中,假设所有单词都只由小写字母构成 对cat,cash,app,apple,aply,ok 建一颗字典树,建成之后如下图所示 由此可以看出: 1、字典树用边表示字母 2、有相同前缀的单词公用前缀节点,那我们可以的得出每个节点最多有26个子节点(在单词只包含小写字母的情况下) 3、整棵树的根节点是空的。为什么呢?便于插入和查找,这将会在后面解释。 4、每个单词结束的时候用一个特殊字符表示,图中用的‘′,那么从根节点到任意一个‘′,那么从根节点到任意一个‘’所经过的边的所有字母表示一个单词。 三、基本操作 A、insert,插入一个单词 1.思路 从图中可以直观看出,从左到右扫这个单词,如果字母在相应根节点下没有出现过,就插入这个字母;否则沿着字典树往下走,看单词的下一个字母。 这就产生一个问题:往哪儿插?计算机不会自己选择位置插