codevs1051
题目地址:http://codevs.cn/problem/1051/
分析:
——题目难度:提高一等
1、数据结构(Data Structure):①Hash(用map或人工)②Stack(栈)
2、算法(Algorithm): DP 穷举
3、题目简述:
给出了n个按长度排序单词,假设某单词i是某单词j的前缀,i->j算一次接龙(两个同样的单词不能算接龙) 求最长龙的长度
4、算法描写叙述:
算法①:
这题我第一感觉是DP,和打导弹(拦截导弹)那题大同小异,可是n的范围伤不起 最大100000
时间复杂度:O(n^2)
空间复杂度:O(n)
非常明显不行
算法②:
事实上按照题目中这样的接龙的方式。我们非常easy就想到枚举的算法。比方有一个单词tihs,我们先枚举tih。再枚举ti,再枚举t , 枚举他们是不是在前面出现过(题目说了单词按长度排序,至于为什么倒过来而不是先t再ti再tih ,是由于这样第一次找到的一定是最长的那个。直接改动了break就能够了,推断是否出现过就用哈希表了)
这种算法明显比算法①快,但还是有压力的
时间复杂度:哈希表我用的map实现(偷懒- -) map查找和插入都是O(log n)
一共是N个单词,每一个单词要查找k次,插入1次
总时间复杂度O(n * k * log n + n * log n),
PS:咳咳,仅供參考啊 參考 參考
空间复杂度: O(n) 仅仅要有Hash就能够了 Map是动态扩展
这样看。空间上没有问题,但时间上还是非常危急,在OJ上这个算法我拿了80分,2个点接近2.4秒,非常恐怖
算法③:
这个算法有一些技巧,但也不难想到,为什么这么说呢?
事实上仅仅要你是一个玩过接龙游戏的人看这个题目的时候就会发现这个规则十分的特别,寻常的接龙游戏是后缀接前缀,而本题的规则非常特殊。前缀才是接龙
这就启示我们将全部单词按字典序排序,这样就使得前缀同样的单词被“挤”在一起了
然后我们维护一个栈,枚举全部的字符串(按字典序排好的) 假设当前的字符串能和栈顶的字符串接龙的话。那么当前字符串入栈,继续枚举下一个字符串。假设不能接龙,那么栈顶字符串弹出,当前字符串继续与弹出后的栈顶字符串比較。直到当前字符串与栈顶字符串能接成龙,然后当前字符串入栈,在这期间统计栈最多有多少个元素
5、总结
本题主要在于怎样巧妙地理解并运用题目中接龙的规则。 然后合理使用栈这一数据结构
代码:
#include <string> #include <algorithm> #include <iostream> #include <stack> using namespace std;typedef struct data{ string s; }data;bool cmp(data x,data y) { int len = x.s.length() < y.s.length() ? x.s.length(): y.s.length(); for(int i = 0; i < len; i++) { if(x.s[i] < y.s[i]) return true; else if(x.s[i] > y.s[i]) return false; } if(x.s.length() < y.s.length()) return true; else return false; } data ch[100007];int main() { int n; cin>>n; for(int i = 0; i < n; i++) cin>>ch[i].s;sort(ch,ch+n,cmp); stack<data> mystatck; int max = 1; mystatck.push(ch[0]); data tmp; for(int i = 1; i < n; i++) { tmp = mystatck.top(); if(ch[i].s.find(tmp.s,0) == 0) { if(tmp.s.length() != ch[i].s.length()) mystatck.push(ch[i]); } else { while( !mystatck.empty()){ tmp = mystatck.top(); if(ch[i].s.find(tmp.s,0) == 0) break; mystatck.pop(); } mystatck.push(ch[i]); } max = max > mystatck.size() ?
max : mystatck.size(); // cout<<mystatck.size()<<endl; } cout<<max<<endl; return 0; }
转载于:https://www.cnblogs.com/zsychanpin/p/7043586.html
codevs1051相关推荐
最新文章
- ldd3笔记_3_编译模块
- java 微信多媒体文件_java微信开发之上传下载多媒体文件
- php打开目录文件类型,php中打开目录并输出目录文件实现代码
- smarty模板引擎总结六配置网站title,keywords,description
- dup和dup2的使用方法
- 长春java培训老师
- AcWing提高算法课Level-3 第四章 高级数据结构
- sudo spctl --master-disable_2020推荐聊城灭火器检测--正规企业--【聊城市久安消防】...
- 217.存在重复元素 (力扣leetcode) 博主可答疑该问题
- 注册表知识and技巧大全
- 药理学(综合练习)题库【1】
- Go:HTTP长连接
- 希科系统(CxServer)经济效益和社会效益分析
- Bettertouchtool Mac破解版(触摸板增强神器)
- sublime教程以及python环境的配置(二)常用插件安装和Boxy主题配置
- 打开我的电脑的快捷键
- 第五章:用Python分析商品退单数据并找出异常商品
- Windows系统下R语言环境搭建及高级图表绘制
- 云渲染一张图贵吗?渲染问题详解
- 计算流体力学 有限体积法