题目地址: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的更多相关文章

  1. codevs1051单词接龙(栈)

    /* 看到n的范围就觉得这个不可能是DP啥的 因为这个接龙的规则十分的简单 只要前缀相同即可 所以先按字典序排一遍 这样保证符合规则的一定挨着 然后弄一个stack 每次拿栈顶元素看看待入栈的元素是否 ...

  2. [CODEVS1051]接龙游戏

    题目描述 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙. 输入描述 Input D ...

  3. codevs1051接龙游戏

    1051 接龙游戏  

随机推荐

  1. Minix3信号处理分析

    进程的信号处理的相关结构 PM中存放着所有进程的进程描述符,在一个进程描述符中,有一个指针,指向一个sigaction结构二维数组中的一项,表示这个进程所有信号的操作.一个sigaction结构包含信 ...

  2. python jason,pickle

    参考官网 https://docs.python.org/3/library/json.html https://docs.python.org/3/library/pickle.html 了解这两个 ...

  3. J2EE--常见面试题总结 -- 一

    StringBuilder和StringBuffer的区别: String       字符串常量   不可变  使用字符串拼接时是不同的2个空间 StringBuffer  字符串变量   可变   ...

  4. C++使用htslib库读入和写出bam文件

      有时候我们需要使用C++处理bam文件,比如取出read1或者read2等符合特定条件的序列,根据cigar值对序列指定位置的碱基进行统计或者对序列进行处理并输出等,这时我们可以使用htslib库 ...

  5. Python - SIP参考指南 - 介绍

    介绍 本文是SIP4.18的参考指南.SIP是一种Python工具,用于自动生成Python与C.C++库的绑定.SIP最初是在1998年用PyQt开发的,用于Python与Qt GUI toolki ...

  6. .Net主线程扑捉子线程中的异常

    首先看一段C#代码:运行后发现主线程通过try{}catch{}是不能扑捉子线程中的抛出来的异常. 代码 );        }        public void run()        {   ...

  7. PHP通过Zabbix API获取服务器监控信息

    开源监控系统Zabbix提供了丰富的API,供第三方系统调用. 基本步骤如下: 1.获取合法认证:连接对应Zabbix URL,并提供用户名和密码,HTTP方法为"POST",HT ...

  8. 教你五步制作精美的HTML时钟

    学了一段时间的HTML.CSS和JS后,给大家做一款漂亮的不像实力派的HTML时钟,先看图:涉及到的知识点有: CSS3动画.DOM操作.定时器.圆点坐标的计算(好多人是不是已经还给自己的老师了~)  ...

  9. ES6中class关键字

    1 .介绍 //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + th ...

  10. SSH框架基础

    首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...