云计算百科
云计算领域专业知识百科平台

【题解-洛谷】P1481 魔族密码

P1481 魔族密码

题目背景

风之子刚走进他的考场,就……

花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花)

风之子:我呕……(杀死人的眼神)快说题目!否则……-_-###

题目描述

花花:……咦好冷我们现在要解决的是魔族的密码问题(自我陶醉:搞不好魔族里面还会有人用密码给我和菜虫写情书咧,哦活活,当然是给我的比较多拉*_*)。

魔族现在使用一种新型的密码系统。每一个密码都是一个给定的仅包含小写字母的英文单词表,每个单词至少包含 111 个字母,至多 757575 个字母。如果在一个由一个词或多个词组成的表中,除了最后一个以外,每个单词都被其后的一个单词所包含,即前一个单词是后一个单词的前缀,则称词表为一个词链。例如下面单词组成了一个词链:

  • i\\verb!i!i;
  • int\\verb!int!int;
  • integer\\verb!integer!integer。

但下面的单词不组成词链:

  • integer\\verb!integer!integer;
  • intern\\verb!intern!intern。

现在你要做的就是在一个给定的单词表中取出一些词,组成最长的词链,就是包含单词数最多的词链。将它的单词数统计出来,就得到密码了。

风之子:密码就是最长词链所包括的单词数阿……

输入格式

这些文件的格式是,第一行为单词表中的单词数 NNN(1≤N≤20001 \\le N \\le 20001≤N≤2000),下面每一行有一个单词,按字典顺序排列,中间也没有重复的单词。

输出格式

输出共一行,一个整数,表示密码。

输入输出样例 #1

输入 #1

5
i
int
integer
intern
internet

输出 #1

4

思路1

看到全部是小写字母第一反应是trie树。思路是每插入一个单词就计算一下从第一个单词到当前这个单词的最长词链,并更新答案。实现方法是插入单词的每个字符过程中记录遇到的每个节点的计数sum,取最大值,直到词尾,将sum+1记录进当前词尾节点的计数。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=2000*80,M=80;
int n,tr[N][26],cnt[N],idx,ans;
char str[M];
void inser(char s[]){
int p=0;
int sum=0;
for(int i=0;s[i];i++){
int u=s[i]–'a';
if(!tr[p][u]) tr[p][u]=++idx;
if(cnt[p]) sum=max(sum,cnt[p]);
p=tr[p][u];
}
cnt[p]=sum+1;
ans=max(ans,cnt[p]);
}
int main(){
cin>>n;
while(n—){
cin>>str;
inser(str);
}
cout<<ans;
return 0;
}

结果如下:(100分)
在这里插入图片描述

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【题解-洛谷】P1481 魔族密码
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!