单词

洛谷 P1019 单词接龙

我怕爱的太早我们不能终老 提交于 2019-11-27 16:34:23
洛谷 P1019 单词接龙 题目描述 今年是国际数学联盟确定的“ 2000 2 0 0 0――世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰 90 9 0周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友 XZ X Z也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为 N N的数字串,要求选手使用 K K个乘号将它分成 K+1 K + 1个部分,找出一种分法,使得这 K+1 K + 1个部分的乘积能够为最大。 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串: 312 3 1 2, 当 N=3,K=1 N = 3 , K = 1时会有以下两种分法: 1、 3 \times 12=36 3 × 1 2 = 3 6 2、 31 \times 2=62 3 1 × 2 = 6 2 这时,符合题目要求的结果是: 31 \times 2 = 62 3 1 × 2 = 6 2 现在,请你帮助你的好朋友 XZ X Z设计一个程序,求得正确的答案。 输入格式 程序的输入共有两行: 第一行共有 2 2个自然数 N,K N , K( 6≤N≤40,1≤K≤6 6 ≤ N ≤ 4 0 , 1 ≤ K ≤ 6) 第二行是一个长度为 N N的数字串。 输出格式 结果显示在屏幕上,相对于输入

洛谷P1019 [NOIP2000]单词接龙(DFS)

拥有回忆 提交于 2019-11-27 14:52:31
跳转了解题意 分析:是一道DFS的简单题,DFS的思想是穷举,那我们就把所有可能的龙都穷举出来,取长度最长的那个, 难点在于字符串匹配,即一个字符串接在另一个字符串后面的代码实现。 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; char s[50][50]; int n,ans,len=1; int vis[50]; inline void dfs(int k) { ans=max(ans,len); for(int i=1;i<=n;i++) { if(vis[i]<2) { for(int j=0;j<strlen(s[k]);j++) { if(s[i][0]==s[k][j]) { int cnt1=0,cnt2=j; while(s[i][cnt1]==s[k][cnt2]&&cnt2<strlen(s[k])) cnt1++,cnt2++; if(cnt2==strlen(s[k])) { vis[i]++; len+=strlen(s[i])-cnt1; dfs(i); vis[i]--; len-=strlen(s[i])-cnt1; } } } } } } int main() { scanf("%d",&n); for

【AC自动机】单词

和自甴很熟 提交于 2019-11-27 14:12:37
【题目链接】 https://loj.ac/problem/10060 【题意】 某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。 【题解】 与AC自动机模板题3类似,但是这个题目记录的子串是不能重叠的。 利用下标从后往前历遍,然后把对应的位置的地方叠加到公共后缀。原因是:如果该单词出现过,那么对应的公共后缀肯定也出现过。 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int N = 1005; 5 const int M = 1e6+10; 6 char S[N][205]; 7 int Trie[M][26],fail[M],End[M],Sz[M]; 8 int Q[M],Head,Tail; 9 int head[M],nxt[M],to[M],cnt; 10 int n,idx=1; 11 12 void Add_edge(int u,int v); 13 void dfs(int u); 14 void Insert( char s[] , int Id){ 15 int p = 1 ; 16 for(int i=0;s[i];i++){ 17 int t = s[i] - 'a' ; 18 if(

【Trie】背单词

泄露秘密 提交于 2019-11-27 14:07:51
参考博客: https://www.luogu.org/problemnew/solution/P3294 https://blog.csdn.net/VictoryCzt/article/details/87186287 【题意】 题意如果看不懂,请到第二个链接去推一推事例,你就明白这个过程了。 来自题解中glf大佬的解析。 这题目描述真是令人窒息。 3个条件的意思大概是这样: (1).如果有单词作为现在正在填入的单词的后缀但并未填入,将花费n*n的代价。 (2).如果没有单词作为当前填入单词的后缀,代价为当前填入单词序号x (3).如果所有作为该单词的后缀的单词之前都已经填入,那么代价为当前序号x-最后一个作为当前单词的后缀的单词的序号y。 【题解】 读懂题以后这道题还是比较明显的贪心。第1个条件提示一定是先将所有作为后缀的单词填入,因为如果不这样填不管怎么样代价都小于n*n。 由于询问的是后缀,所以后缀相同其实等价于反串的前缀相同,所以倒着建立一个trie树。 这时问题转化为求一棵树的拓扑序,满足儿子与父亲的编号差的和最小,所以可以直接贪心来做,简单观察发现,对于某一刻,无论选哪个节点,总代价都会增大目前能扫到的第一个标记点的总量。 要使总代价最少,那么这次选的点一定要使以后增加的点最小. 所以记录一下每个点能看到的,以及这一个子树下分支总量,一定优先处理分支更小的子树。 1

cogs 647. [Youdao2010] 有道搜索框 Trie树 字典树

坚强是说给别人听的谎言 提交于 2019-11-27 10:58:56
647. [Youdao2010] 有道搜索框 ★☆ 输入文件: youdao.in 输出文件: youdao.out 简单对比 时间限制:1 s 内存限制:128 MB 【问题描述】 在有道搜索框中,当输入一个或者多个字符时,搜索框会出现一定数量的提示,如下图所示: 现在给你 N 个单词和一些查询,请输出提示结果,为了简这个问题,只需要输出以查询词为前缀的并且按字典序排列的最前面的 8 个单词,如果符合要求的单词一个也没有请只输出当前查询词。 【输入文件】 第一行是一个正整数 N ,表示词表中有 N 个单词。 接下来有 N 行,每行都有一个单词,注意词表中的单词可能有重复,请忽略掉重复单词。所有的单词都由小写字母组成。 接下来的一行有一个正整数 Q ,表示接下来有 Q 个查询。 接下来 Q 行,每行有一个单词,表示一个查询词,所有的查询词也都是由小写字母组成,并且所有的单词以及查询的长度都不超过 20 ,且都不为空 其中: N<=10000,Q<=10000 【输出文件】 对于每个查询,输出一行,按顺序输出该查询词的提示结果,用空格隔开。 【样例输入】 youdao.in 10 a ab hello that those dict youdao world your dictionary 6 bob d dict dicti yo z 【样例输出】 youdao.out bob

P1481 魔族密码(LIS变形)

点点圈 提交于 2019-11-27 08:16:32
题目描述(题目链接: https://www.luogu.org/problem/P1481 ) 风之子刚走进他的考场,就…… 花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 风之子:我呕……(杀死人的眼神)快说题目!否则……-_-### 花花:……咦 好冷 我们现在要解决的是魔族的密码问题(自我陶醉:搞不好魔族里面还会有人用密码给我和菜虫写情书咧,哦活活,当然是给我的比较多拉*^_^*)。魔族现在使用一种新型的密码系统。每一个密码都是一个给定的仅包含小写字母的英文单词表,每个单词至少包含1个字母,至多75个字母。如果在一个由一个词或多个词组成的表中,除了最后一个以外,每个单词都被其后的一个单词所包含,即前一个单词是后一个单词的前缀,则称词表为一个词链。例如下面单词组成了一个词链: i int integer 但下面的单词不组成词链: integer intern 现在你要做的就是在一个给定的单词表中取出一些词,组成最长的词链,就是包含单词数最多的词链。将它的单词数统计出来,就得到密码了。 风之子:密码就是最长词链所包括的单词数阿…… 花花:活活活,还有,看你长得还不错,给你一个样例吧: 输入格式 这些文件的格式是,第一行为单词表中的单词数N(1<=N<=2000),下面每一行有一个单词,按字典顺序排列,中间也没有重复的单词咧!! 输出格式

Python--变量命名规范

前提是你 提交于 2019-11-27 05:24:23
命名规则可以被视为一种惯例,别无绝对与强制,目的是为了增加代码的识别和可读性 注意:python 中的标识符是区分大小写的 1.在定义变量时,为了保证代码格式,=的左右两边该各保留一个空格 2.在 python 中,如果变量名需要由两个或多个单词组成,可以按照以下方式命名(python中常用) 每个单词都使用小写字母 单词与单词之间使用_下划线连接 例如:first_name,last_name….驼峰命名法:(其他语言常用的命名法) 当变量名是由两个或多个单词组成,还可以利用驼峰命令法来命名 小驼峰命名法: 第一个单词以小写字母开始,后续单词的首字母大写 firstName lastName 大驼峰命名法: 每一个单词的首字母都采用大写字母 FirstName LastName 来源: https://www.cnblogs.com/wangyanyan/p/11346987.html

统计单词个数

走远了吗. 提交于 2019-11-27 03:24:29
方法1: 统计空格数?? 问题:没考虑多个空格相连的情况 方法2:如果一个空格紧跟一个非空格,一定是新单词开始 this is my first test! 问:第一个单词没算上? 答:count 再加1就行!?? 再问:若第一个单词前有空格会怎样?就又多了1 解决办法: if(a[0]!=' ') count++; 方法3:如果一个非空格后是一个空格,一定是单词的结束 this is my first test! 问:最后一个单词没算上? 答:count 再加1就行!?? 再问:若最后一个单词后有空格会怎样?就又多了1 解决办法: if(a[len-1]!=' ') count++; 程序设计; #include <iostream> #include <cstring> using namespace std; int main() { int word=0,count=0; char a[1001]; gets(a); for(int i=0;a[i]!='\0';i++) { if(a[i]!=' '&&word==0) //新单词出现 { word=1; count++; } if(a[i]==' ') //遇到空格,word置0 word=0; } cout<<count<<endl; } 来源: https://blog.csdn.net/weixin

单词接龙

假如想象 提交于 2019-11-27 02:13:20
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast 和 astonish ,如果接成一条龙则变为 beastonish ,另外相邻的两部分不能存在包含关系,例如 at 和 atide 间不能相连。 输入格式 输入的第一行为一个单独的整数 n ( n ≤ 2 0)表示单词数,以下 n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在. 输出格式 只需输出以此字母开头的最长的“龙”的长度 输入输出样例 输入 #1 5 at touch cheat choose tact a 输出 #1 23 说明/提示 (连成的“龙”为atoucheatactactouchoose) NOIp2000提高组第三题 分析: 由于本题中n<=20,故可以尝试使用dfs暴力枚举下一个选择的字符串,并与上一个进行比对,这样的话是2^20,依然不会超时。 CODE: 1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6