题目描述

给出了N个单词,已经按长度排好了序。如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙)。

你的任务是:对于输入的单词,找出最长的龙。

输入描述 Input Description

第一行为N(1<=N<=105)。以下N行每行一个单词(由小写组成),已经按长度排序。(每个单词长度<50)

输出描述 Output Description

仅一个数,为最长的龙的长度。

数据范围及提示 Data Size & Hint

1<=N<=105

看到这道题,虽然知道是用栈来做,但是还是没有思路,太弱……就去找题解(捂脸熊

大概是这样子的:

我们玩过的接龙游戏一般都是A是B的后缀,则可以接龙;但是这道题为i是j的前缀,那么i->j算一次接龙,所以可以把输入的单词按字典序排序,那么前缀相同的单词就会堆在一起了(sort(ch,ch+n,cmp))

这时我们维护一个栈,首先将第一个单词入栈,将每一个单词与栈顶元素find,如果在第i个单词中第0个位置开始可以找到top,那么我们把第i个单词入栈,继续读下一个单词;

如果不能找到,则弹出栈顶元素,将第i个单词与新的栈顶元素进行相同的操作,直到栈空,将第i个单词入栈。

在以上过程中,我们可以不断更新max的值,表示栈中的元素,即最多有多少个单词可以互相接龙,max=max<stack.size()?stack.size():max;

这道题的思路就是这样子了。代码自己改了半天。。。。

代码:

#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
using namespace std;
typedef struct data
{
string s;
}data;
data ch[];
bool cmp (data x,data y)
{
int len=x.s.length()>y.s.length()?x.s.length():y.s.length();
for(int i=;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;
}
int main()
{
int n,max=;
cin>>n;
for(int i=;i<n;++i)
cin>>ch[i].s;
sort(ch,ch+n,cmp);
/*for(int i=0;i<n;++i)
cout<<ch[i].s<<' ';*/
stack<data> mystack;
mystack.push(ch[]);
for(int i=;i<n;++i)
{
data tmp;
tmp=mystack.top();
if(ch[i].s.find(tmp.s,)==)
{
if(tmp.s.length()!=ch[i].s.length())
mystack.push(ch[i]);
}
else
{
while(!mystack.empty())
{
tmp=mystack.top();
if(ch[i].s.find(tmp.s,)==)
break;
mystack.pop();
}
mystack.push(ch[i]);
}
max=max>mystack.size()?max:mystack.size();
}
cout<<max<<endl;
return ;
}

[CODEVS1051]接龙游戏的更多相关文章

  1. codevs1051接龙游戏

    1051 接龙游戏  

  2. AC日记——接龙游戏 codevs 1051

    1051 接龙游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...

  3. codevs 1051 接龙游戏

    codevs 1051 接龙游戏 http://codevs.cn/problem/1051/ 题目描述 Description 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i- ...

  4. 接龙游戏(codevs 1051)

    1051 接龙游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 给出了N个单词,已经按长度排好了序 ...

  5. Flask开发成语接龙游戏,闲来无事手机玩玩自己写的游戏吧!

    英语单词学习应用 周五发布的文章Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署发布后,看到喜欢的人比较多.本来周末打算照着扇贝/极光单词,写一个英语单词自测工具.但苦 ...

  6. 字典树+博弈 CF 455B A Lot of Games(接龙游戏)

    题目链接 题意: A和B轮流在建造一个字,每次添加一个字符,要求是给定的n个串的某一个的前缀,不能添加字符的人输掉游戏,输掉的人先手下一轮的游戏.问A先手,经过k轮游戏,最后胜利的人是谁. 思路: 很 ...

  7. codevs 1051 接龙游戏(栈模拟)

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

  8. [codevs 1051]接龙游戏(栈)

    题目:http://codevs.cn/problem/1051/ 分析: 当然单词查找树是可以的,但这题有更为简便的方法.可以先按字典序排序,然后弄一个栈,如果当前字串可以接到栈顶元素的后面,那么当 ...

  9. codevs1051

    题目地址:http://codevs.cn/problem/1051/ 分析: --题目难度:提高一等 1.数据结构(Data Structure):①Hash(用map或人工)②Stack(栈) 2 ...

随机推荐

  1. pthread_cancel函数注意事项

    /************************************************** 相关函数: #include <pthread.h> int pthread_can ...

  2. madplay移植

    移植前需求准备: a. 源码包: 1. libid3tag-0.15.1b.tar.gz 2. libmad-0.15.1b.tar.gz 3. madplay-0.15.2b.tar.gz 4. z ...

  3. 一个简单的linux下设置定时执行shell脚本的示例

    很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如说定时去备份服务器数据.数据库数据等 不适合人工经常做的一些操作这里简单说下 shell Shell俗称壳,类似于DOS下的command ...

  4. VScode的settings.json配置

    { "editor.mouseWheelZoom": true, "astyle.additional_languages": [ "c", ...

  5. Computer HDU - 2196

    Computer HDU - 2196 A school bought the first computer some time ago(so this computer's id is 1). Du ...

  6. Windows下安装配置SQLite和使用的教程

    什么是SQLite SQLite是一款非常轻量级的关系数据库系统,支持多数SQL92标准.SQLite在使用前不需要安装设置,不需要进程来启动.停止或配置,而其他大多数SQL数据库引擎是作为一个单独的 ...

  7. 快速排序,对于相同元素的优化,c++

    #include<iostream>using namespace std; void middl(int &p,int &q,int &r)//找枢轴,然后把枢轴 ...

  8. Java最小堆解决TopK问题

    TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的 ...

  9. ZOJ 3231 Apple Transportation 树DP

    一.前言 红书上面推荐的题目,在138页,提到了关键部分的题解,但是实际上他没提到的还有若干不太好实现的地方.尤其是在这道题是大家都拿网络流玩弄的大背景下,这个代码打不出来就相当的揪心了..最后在牛客 ...

  10. WPF实现QQ群文件列表动画(一)

    QQ群大家都用过,先看下目前QQ的群文件列表容器的效果: 细心点大家就会发现,这玩意收缩和展开是带动画的,并不是很僵硬地直接收缩或者直接展开,毫无疑问,如果用WPF实现这样的效果,这里的最佳控件是Ex ...