【wikioi】1018 单词接龙
算法:DFS+考你阅题
题目描述:
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。
此题深坑,误人子弟,如果就普通的搜索只得66分
注意(看了题解后发现的= =):
- 所谓“两部分不能存在包含关系”,是指两部分接龙后不能长度不增加。例如ababab和ababab,可以接成ababababab,但不能为ababab。
- 接龙时,如果两个单词接龙后的单词有多种情况,要尽可能保证接龙后的单词最长。例如cabab和ababc,一定要接成cabababc,为而不是cababc。(也就是说在枚举确定两个单词是否可以相接时可以从后往前枚举)
做好这两个,就能A了
上代码:
#include <iostream>
#include <string>
#include <cstring>
using namespace std; string word[21];
int vis[21]; //2次为访问过2次
int n;
int ans = 0;
void dfs(string str, int o) //o是指是添加哪一个单词的下标
{
if(vis[o] > 2) return; //如果添加的已经超过了2,则不判断
//cout << str << endl;
if(str.size() > ans) ans = str.size(); //更新最大值
int i, j, k, pos;
for(i = 1; i <= n; i++)
{
if(vis[i] < 2) //如果没有用到2次
{
//如果有包含关系 并且要取最后面的!注意!
//如果两个单词接龙后的单词有多种情况,要尽可能保证接龙后的单词最长。例如cabab和ababc,
//一定要接成cabababc,为而不是cababc。(也就是说在枚举确定两个单词是否可以相接时可以从后往前枚举)
pos = -1;
for(j = 1; j < str.size(); j++)
{
if(str[j] == word[i][0])
{
for(k = 1; k < word[i].size() && k+j < str.size(); k++)
if(str[j+k] != word[i][k]) break;
if(k+j == str.size() && k != word[i].size()) //有重合
pos = j; //pos记录最后面那个能匹配的下标
} }
if(pos != -1) //有重合并且下标到最后一个
{
string t = str;
t.append(word[i], k, word[i].size()-k+1); //添加除了重合部分的word进入新串
if(t == str) continue;
vis[i]++; //设置标志
dfs(t, i);
vis[i]--; //清除标志,因为后面可能还会用到i
}
}
}
} int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> word[i];
char begin;
cin >> begin;
for(int i = 1; i<= n; i++)
if(word[i][0] == begin)
{
vis[i]++; //初始赋值
dfs(word[i], i);
memset(vis, 0, sizeof(vis)); //要注意清除
}
cout << ans;
return 0;
}
【wikioi】1018 单词接龙的更多相关文章
- Codevs 1018 单词接龙
1018 单词接龙 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描 ...
- codevs 1018 [noip 2000 提高] 单词接龙
题目链接:http://codevs.cn/problem/1018/ 题目描述 Description 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
- 单词接龙(codevs 1018)
2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 单词接龙是一个与我们经 ...
- NOIP2000单词接龙[DFS]
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- Noip2000 T3 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 洛谷 P1019 单词接龙 Label:dfs
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- NOIP2000 单词接龙
题三. 单词接龙 (27分) 问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...
- 1172: 单词接龙(XCOJ 暴力DFS)
1172: 单词接龙 时间限制: 1 Sec 内存限制: 128 MB提交: 12 解决: 5 标签提交统计讨论版 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词 ...
- 单词接龙(dragon)
单词接龙(dragon) 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ...
随机推荐
- HDOJ 1075
字典树 9890974 2013-12-25 15:31:06 Accepted 1075 468MS 59832K 1342 B G++ 泽泽 #include<stdio.h> #in ...
- Linux运维相关目录
- LSB 简介
前 Linux 的发行版非常繁多,为了促进 Linux 不同发行版间的兼容性,LSB(Linux Standards Base)开发了一系列标准,使各种软件可以很好地在兼容 LSB 标准的系统上运行, ...
- vim实用技巧
<1> 删除空格: :% s/ //gi #正则为一个空格,替换为空,全局匹配. <2> 删除空行: :g /^\n*$/ d #g为global 正则为:行开始+换 ...
- 【OpenStack】OpenStack系列13之Nova源码解析与API扩展
学习思路 议程:代码结构-主干流程-分层架构-业务模型-数据库模型-消息模型 分布式架构:Api:横向扩展 rpc:纵向扩展 分层架构:Controller接口层.View/Manager逻辑层 ...
- Kmin
Kmin of Array [本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array.html [代码] C++ Code 12345678 ...
- 63.如何对单链表进行快排?和数组快排的分析与对比[quicksort of array and linked list]
[本文链接] http://www.cnblogs.com/hellogiser/p/quick-sort-of-array-and-linked-list.html [题目] 单链表的特点是:单向. ...
- Java for LeetCode 162 Find Peak Element
A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...
- HybridApp iOS ATS解决方案
苹果在最近的一次WWDC上提出将在2017年1月1日起强制我们用HTTPS,否则提交App可能会被拒绝.很多ios应用的已经放出支持HTTPS的SDK了.本文主要针对混合式IOS应用提供相关的解决方案 ...
- pyinstaller--将py文件转化成exe
首先要注意一下:打包python文件成exe格式这个过程只能在windows环境下运行 1. 直接在命令行用pip安装 pyinstaller pip install pyinstaller</ ...