codevs 1051 接龙游戏
题目描述 Description

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

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

输入描述 Input Description

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

输出描述 Output Description

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

样例输入 Sample Input

5

i

a

int

able

inter

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

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 接龙游戏的更多相关文章

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

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

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

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

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

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

  4. 接龙游戏(codevs 1051)

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

  5. codevs1051接龙游戏

    1051 接龙游戏  

  6. [CODEVS1051]接龙游戏

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

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

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

  8. codevs 1052 地鼠游戏

    1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...

  9. codevs 1033 蚯蚓的游戏问题

    Description 在一块梯形田地上,一群蚯蚓在做收集食物游戏.蚯蚓们把梯形田地上的食物堆积整理如下: a(1,1)  a(1,2)…a(1,m) a(2,1)  a(2,2)  a(2,3)…a ...

随机推荐

  1. iOS [[NSBundle mainBundle] pathForResource:@"" ofType:@""]无法获取到文件

    将一个文件导入到工程中后,用[[NSBundle mainBundle] pathForResource:@"" ofType:@""]来获取到该文件时,一直无 ...

  2. 百度编辑器ueditor 异步加载时,初始化没办法赋值bug解决方法

    百度编辑器ueditor 异步加载时,初始化没办法赋值bug解决方法 金刚 前端 ueditor 初始化 因项目中使用了百度编辑器——ueditor.整体来说性能还不错. 发现问题 我在做一个编辑页面 ...

  3. C#中==与Equals方法的区别

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  4. #VSTS日志# 2015/12/10 – 终于可以删除工作项了

    最近的更新不少,废话少说,直接上干货 定制工作项字段 本周的更新后,所有的用户都可以在vsts上直接给工作项添加字段了,具体内容包括– 添加新字段(日期,字符串,整形,数字)– 字段显示位置配置– 过 ...

  5. android双击返回键退出程序的实现

    /** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-gen ...

  6. 用java的jdk 生成android 的jni接口文档

    1 检查系统是否安装了jdk,并将javac的路径配置到PATH中  cmd窗口,输入 java -version  查看输出项 2 创建需要so的接口类package com.ndk.test; p ...

  7. ORA-00600: internal error code, arguments: [kcblasm_1], [103], [], [], [], [], [], []

    一ORACLE 10.2.0.5.0 标准版的数据库的告警日志出现ORA-00600错误,具体错误信息如下所示 Errors in file /u01/app/oracle/admin/SCM2/bd ...

  8. ADDM Reports bug:Significant virtual memory paging was detected on the host operating system

    查看ADDM(数据库版本为ORACLE 10.2.0.5.0)报告时,发现其中有个结论非常不靠谱:Significant virtual memory paging was detected on t ...

  9. PHP 替换标签和标签内的内容

    $filter_arr=array('/#(.*?)#/','/\$(.*?)\$/','/\^(.*?)\^/');//要替换的标签 $content=$data['Monthlys']['cont ...

  10. iOS UIAlertView添加输入框

    这玩意有时不用就忘,还是记录一下吧 添加: UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"新建文件夹" mes ...