题目描述

给出了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 ;
}

最新文章

  1. Oracle数据库坏块的恢复
  2. adb 命令
  3. [UCSD白板题] Maximum Pairwise Product
  4. DropDownList
  5. CF 213A Game(拓扑排序)
  6. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇
  7. 如何使用java中的对象
  8. HW4.33
  9. BZOJ 1679: [Usaco2005 Jan]Moo Volume 牛的呼声( )
  10. Testin一日游实验室发布的行级APP质量报告:在那里拍携程双赢
  11. Codeforces 765E. Tree Folding [dfs][树形dp]
  12. iOS开发基础-UIScrollView基础
  13. 元组tuple 可迭代对象
  14. mktime 夏令时
  15. httpclient实现的get请求及post请求
  16. Beta周第7次Scrum会议(11/16)【王者荣耀交流协会】
  17. 关于Firedac的一点看法
  18. Git Step by Step – (6) Git远程仓库
  19. gcd模板(欧几里得与扩展欧几里得、拓展欧几里得求逆元)
  20. iis托管管道模式-学习

热门文章

  1. BZOJ1576: [Usaco2009 Jan]安全路经Travel(最短路 并查集)
  2. C++ 学习笔记 (六) 继承- 子类与父类有同名函数,变量
  3. js时间转换
  4. 制定RPM包和加入YUM源
  5. php中foreach循环遍历二维数组
  6. 常见的js算法面试题收集,es6实现
  7. Python学习笔记(三):文件和集合操作
  8. Mysql密码加密方式
  9. TCP/IP网络编程之网络编程和套接字
  10. leetcode 【 Maximum Subarray 】python 实现