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;
}
codevs1051的更多相关文章
- codevs1051单词接龙(栈)
/* 看到n的范围就觉得这个不可能是DP啥的 因为这个接龙的规则十分的简单 只要前缀相同即可 所以先按字典序排一遍 这样保证符合规则的一定挨着 然后弄一个stack 每次拿栈顶元素看看待入栈的元素是否 ...
- [CODEVS1051]接龙游戏
题目描述 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙. 输入描述 Input D ...
- codevs1051接龙游戏
1051 接龙游戏
随机推荐
- NFC (Near Filed Communication)
NFC的用途:近场通信(Near Field Communication,NFC),又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输(在十厘米内)交换数据 ...
- ueditor插入百度音乐无法播放-403 问题
简单记录一下,其实403是因为百度音乐设置了禁止外部连接引用,因此 几乎所有的百度音乐播放都会提示403. 注意:预览页面(dialog/music/music.html)和实际插入页面(uedito ...
- 重构手法之Extrct Method(提炼函数)
返回总目录 本节包含3个手法: 1.Extract Method(提炼函数) 2.Inline Method(内联函数) 3.Inline Temp(内联临时变量) Extract Method(提炼 ...
- 盒子端 CSS 动画性能提升研究
不同于传统的 PC Web 或者是移动 WEB,在腾讯视频客厅盒子端,接大屏显示器(电视)下,许多能流畅运行于 PC 端.移动端的 Web 动画,受限于硬件水平,在盒子端的表现的往往不尽如人意. 基于 ...
- [转载] redis-cluster研究和使用
转载自http://hot66hot.iteye.com/blog/2050676 最近研究redis-cluster,正好搭建了一个环境,遇到了很多坑,系统的总结下,等到redis3 release ...
- matlab R2016a 中添加新的工具箱的方法
matlab添加新的工具箱分三步: 1. 下载新的工具箱,并解压. 2. 将解压后的工具箱文件夹移到安装的matlab中的toolbox文件夹中 3. 添加新文件夹及其子文件夹到路径中. 接下来以添加 ...
- cgg之字面值
字面值时源代码中用来描述固定值的记号,可能是整数.浮点数.字符或者字符串 2.1 整数常量 除了常见的十进制数外,还有八进制(以数字0开头)或者十六进制(0x/0X)表示法. #include < ...
- Python之getopt模块
1.getopt——C风格命令行解析 http://docs.python.org/2.7/library/getopt.html#module-getopt getopt.getopt(args, ...
- Shiro SpringMVC 非maven HelloWorld
项目用到Shiro就从网上找一些案例看看吧,结果看了很多都是maven的,没有办法就自己弄了一个.废话不多说,原理自己找开始上菜. 配置web.xml <?xml version="1 ...
- 赢在面试之Java泛型篇(十二)
139. Java中的泛型是什么 ? 使用泛型的好处是什么? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数. 好处: 1.类型安全,提供编译期 ...