[vijos1028] 魔族密码
来源:互联网 发布:angular.js介绍 编辑:程序博客网 时间:2024/05/08 08:25
题目描述
风之子刚走进他的考场,就……
花花:当当当当偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 好冷~~我们现在要解决的是魔族的密码问题(自我陶醉:搞不好魔族里面还会有人用密码给我和菜虫写情书咧,哦活活,当然是给我的比较多拉^_^)。魔族现在使用一种新型的密码系统。每一个密码都是一个给定的仅包含小写字母的英文单词表,每个单词至少包含1个字母,至多75个字母。如果在一个由一个词或多个词组成的表中,除了最后一个以外,每个单词都被其后的一个单词所包含,即前一个单词是后一个单词的前缀,则称词表为一个词链。例如下面单词组成了一个词链:
风之子:我呕……(杀死人的眼神)快说题目!否则……-_-###
花花:……咦
i
int
integer
但下面的单词不组成词链:
integer
intern
现在你要做的就是在一个给定的单词表中取出一些词,组成最长的词链,就是包含单词数最多的词链。将它的单词数统计出来,就得到密码了。
风之子:密码就是最长词链所包括的单词数阿……
花花:活活活,还有,这些文件的格式是,第一行为单词表中的单词数N(1<=N<=2000),下面每一行有一个单词,按字典顺序排列,中间也没有重复的单词咧!!你要提交的文件中只要在第一行输出密码就行啦^^看你长得还不错,给你一个样例吧:
样例数据
样例输入
5
i
int
integer
intern
internet
样例输出
4
题目分析
题目背景和小飞侠的游园方案一样逗比
第一次用的Trie树遍历水过,然后发现自己想复杂了,其实LIS一遍就行了
源代码
trie树
#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>using namespace std;inline const int Get_Int() { int num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj;}const int maxn=300000;struct Tree { int child[65],bj; void clear() { memset(child,0,sizeof(child)); bj=0; }};struct Trie { Tree tree[maxn]; int cnt; void init() { cnt=0; memset(tree,0,sizeof(tree)); } void insert(string s) { //插入字符串s int x=0; for(int i=0; i<s.length(); i++) { int y=s[i]-'a'; if(tree[x].child[y]==0) { //没有此结点,新建结点 tree[x].child[y]=++cnt; tree[cnt].clear(); x=cnt; } else x=tree[x].child[y]; } tree[x].bj=1; } int Find(string s) { int x=0,sum=0; for(int i=0; i<s.length(); i++) { int y=s[i]-'a'; if(tree[x].child[y]==0)return -1; //不在树中 x=tree[x].child[y]; sum+=tree[x].bj; } return sum; }};Trie trie;int n,ans=0;string s[2005];int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1; i<=n; i++) { cin>>s[i]; trie.insert(s[i]); } for(int i=1; i<=n; i++)ans=max(ans,trie.Find(s[i])); printf("%d\n",ans); return 0;}
LIS
#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>using namespace std;inline const int Get_Int() { int num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj;}int n,ans=0;string s[2005];int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1; i<=n; i++)cin>>s[i]; for(int i=1; i<=n; i++) { int sum=0; for(int j=1; j<=i; j++) if(s[i].find(s[j])==0)sum++; ans=max(ans,sum); } printf("%d\n",ans); return 0;}
0 0
- Vijos1028. 魔族密码
- vijos1028魔族密码
- [vijos1028] 魔族密码
- 魔族密码
- ?魔族密码
- P1481 魔族密码
- 魔族密码vijos
- VIJOS P1028 魔族密码
- Vijos P1028魔族密码
- vijos P1028 魔族密码 DP
- Vijos 1028-魔族密码【暴力】
- 魔族密码(Vijos-1028)
- 密码
- 密码
- 密码
- 密码
- 密码
- 密码
- nyoj28_大数阶乘
- Eclipse和PyDev搭建完美Python开发环境(Windows篇)
- 是应该坚持自己,还是听别人的建议?
- Android Nougat多窗口简析
- PHP-单例模式
- [vijos1028] 魔族密码
- 向字符变量赋予整数
- PHP程序自杀
- 布局优化偏------------- include、merge 、ViewStub
- 虚拟机安装centos7后出现的问题
- C++初级主题--(4)引用
- [Android 开发工具] 网络抓包Charles
- JavaScript常用对象
- 用Spark Streaming+Kafka实现订单数和GMV的实时更新