codevs 1051 接龙游戏
给出了N个单词,已经按长度排好了序。如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙)。
你的任务是:对于输入的单词,找出最长的龙。
第一行为N(1<=N<=105)。以下N行每行一个单词(由小写组成),已经按长度排序。(每个单词长度<50)
仅一个数,为最长的龙的长度。
5
i
a
int
able
inter
3
1<=N<=105
方法一:模拟栈
先将输入数据按字典序排序,然后依次枚举,栈顶是当前字符串的前缀,就入栈,否则,栈顶出栈直至当前字符串可以入栈。在此期间,随时更新接龙最大值
以样例为例:设栈为stack[],答案为ans
排序后为:a able i int inter
1、栈为空,a入栈 stack:a ans=1
2、a是able的前缀,able入栈 stack:a able ans=2
3、able不是i的前缀, able出栈 stack:a ans=2
4、a不是i的前缀,a出栈 stack: ans=2
5、栈为空,i入栈 stack:i ans=2
6、i是int的前缀,int入栈 stack:i int ans=2
7、int是inter的前缀,inter入栈 stack:i int inter ans=3
结束
截取前缀时,可以使用assign函数,头文件:cstring
格式:p.assign(s,start,len) 在s中从位置start开始,截取长尾len的字符串复制给p
附:string常用函数:http://www.cnblogs.com/wangkangluo1/archive/2011/07/22/2114118.html
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
string s[],stack[];
int n,top,ans;
bool cmp(string a,string b)
{
return a<b;//按字典序排序,string可以直接调用<,>,=,与int,double一样
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
cin>>s[i];//s存原数据
sort(s+,s+n+,cmp);//按字典序排序
stack[top++]+=s[];//第一个先入栈
ans++;//至少有一个
for(int k=;k<=n;k++)//所有的top均为开区间
{
int l=stack[top-].size();//当前栈顶元素的长度,即s[k]要想入栈,要判断前缀的长度
string p;
p.assign(s[k],,l);//在s[k]中从第0位开始,截取长度为l的字符串,赋值给p
if(p==stack[top-])//因为top为开区间,所以比较的是top-1
{
if(s[k].size()==stack[top-].size()) continue;//前缀相等,总单词长度也相等,那么这两个单词相等,题目说了不能算
stack[top++]=s[k];//可以入栈
}
else
{
while(top&&stack[top-]!=p.assign(s[k],,l))//一直退到能入栈或栈为空
{
top--;
if(top)//栈为空时,top=0,不加这句会RE
l=stack[top-].size();//l转变为下一个要比较的单词的长度
}
stack[top++]=s[k];//入栈
}
ans=max(ans,top);//更新答案
}
cout<<ans;
}
方法二:http://www.cnblogs.com/IUUUUUUUskyyy/p/6193997.html
两个错误:1.退栈时,在比较的是当前栈顶元素,所以l、p需要更新。开始做的时候没有更新,一直用最初的栈顶元素比
2、ans初值为0,for循环从2开始,所以如果只有1个元素,输出0,但应该输出1
codevs 1051 接龙游戏的更多相关文章
- [codevs 1051]接龙游戏(栈)
题目:http://codevs.cn/problem/1051/ 分析: 当然单词查找树是可以的,但这题有更为简便的方法.可以先按字典序排序,然后弄一个栈,如果当前字串可以接到栈顶元素的后面,那么当 ...
- codevs 1051 接龙游戏(栈模拟)
传送门 Description 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙. I ...
- AC日记——接龙游戏 codevs 1051
1051 接龙游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 给出了N个单词,已经按长度排好了序.如果 ...
- 接龙游戏(codevs 1051)
1051 接龙游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 给出了N个单词,已经按长度排好了序 ...
- codevs1051接龙游戏
1051 接龙游戏
- [CODEVS1051]接龙游戏
题目描述 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙. 输入描述 Input D ...
- Flask开发成语接龙游戏,闲来无事手机玩玩自己写的游戏吧!
英语单词学习应用 周五发布的文章Flask开发天气查询软件,带你掌握pipenv的使用与手机Termux下的部署发布后,看到喜欢的人比较多.本来周末打算照着扇贝/极光单词,写一个英语单词自测工具.但苦 ...
- codevs 1052 地鼠游戏
1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...
- codevs 1033 蚯蚓的游戏问题
Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1) a(1,2)…a(1,m) a(2,1) a(2,2) a(2,3)…a ...
随机推荐
- AEAI DP开发平台精要
1 背景概述 相信很多了解数通畅联软件的人对AEAI DP应用开发平台并不陌生,笔者在入职第一天就开始接触AEAI DP,使用AEAI DP开发过AEAI WM.AEAI CRM以及中国XXXX管理系 ...
- (转) 一步一步学习ASP.NET 5 (三)- 认识新的Web结构
转发:微软MVP 卢建晖 的文章,希望对大家有帮助.原文:http://blog.csdn.net/kinfey/article/details/44421979 编者语 : 今天微软的两大盛事,早上 ...
- NSString与奇怪的retainCount
话题从sunnyxx的<黑幕背后的Autorelease>开始 文章开头有个小例子 __weak id reference = nil;- (void)viewDidLoad { [sup ...
- [Linux 性能检测工具]VMSTAT
VMSTAT NAME: Vmstat: 报告虚拟内存统计 语法 : vmstat [-a] [-n] [-t] [-S unit] [delay [ count]] ...
- dubbo-admin-2.5.3 运行报错: Bean property 'URIType' is not writable or has an invalid 解决方法
因为 jdk 是1.8的版本,和 dubbo-admin 存在兼容性问题.所以报错: Bean property 'URIType' is not writable or has an invalid ...
- Linux信号
信号本质上就是一个软件中断,它既可以作为两个进程间的通信的方式, 更重要的是, 信号可以终止一个正常程序的执行, 通常被用于处理意外情况 ,* 信号是异步的, 也就是进程并不知道信号何时会到达 $ki ...
- 知道创宇研发技能表v3.1
by @知道创宇(www.knownsec.com) @余弦 & 404团队 后续动态请关注微信公众号:Lazy-Thought 说明 关于知道创宇 知行合一 | 守正出奇 知道创宇是一家黑客 ...
- Java基础语法总结1
一.标识符及字符集 Java语言规定标识符是以字母.下划线"_"或美元符号"$"开始,随后可跟数字.字母.下划线或美元符号的字符序列.Java标识符大小写敏感, ...
- 定时器的应用---查询方式---让8个LED灯,左右各4个来回亮
定时器的应用,查询方式.让8个LED灯,左右各4个来回亮 代码: /********************** 查询方式是主程序不断的查询是否中断,而不需要准备子程序 *************** ...
- js实现打开网页自动弹出添加QQ好友邀请窗口
我们有时进一些网面或专题页面会自动弹出一个加为好友的对话框了,在研究了很久之后发现可以直接使用js来实现,下面我们一起来看js实现打开网页自动弹出添加QQ好友邀请窗口的方法. 第一步.JS脚本 这个是 ...