题目描述:单词接龙
问题描述:单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们己知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙" 中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。

输入

输入的第一行为一个单独的整数n(n<=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表来“龙”开头的字母。你可以假定以此字母开头的“龙" 一定存在。

输出

只需输出以此字母开头的最长的“龙”的长度

样例输入

5
at
touch
cheat
choose
tact
a

样例输出

23

思路:
开始的思路是:单词词组变成2倍,直接DFS,进入下一次循环的条件是是否存在相同部分。但是存在的问题是单词变成两倍,会出现解遗漏的问题,同时每次的计算量非常大,时间消耗很大,所以不合适。
后来的思路是:计算每个单词之间相同部分的长度,DFS遍历形成子集树即可。 其中还出现了bug,思路和解都是对的,但是一直WA,后来改了<iostream>头文件的位置就对了,要把这个文件放在最前面。
// 单词接龙.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" //思路:单词重复出现两次,找当前单词和其他的最大相同部分。
//存在的问题:每个单词只是和后面的单词寻找相同的部分,但是会遗漏和前面单词相同的部分。所以答案有问题。
//存在的问题:即使改了头文件,结果还是WA!
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std; #define MAX 100
int n, ans, vis[MAX];
string words[MAX];
char ch; int is_contain(string a, string b, int &con)
{
//cout << "a:" << a << "\tb:" << b << endl;
if (b.find(a, ) != string::npos && b != a) //pos-没找到 >=0-找到了
{
//cout << "b contain a" << endl;
return -;
} int alen = a.length();
for (int i = ; i < alen; i++) //从第二个字母开始寻找和其他单词相同的部分
{
string temp = a.substr(i);
if (b.find(temp, ) == && b != temp)
{
con = alen - i;
//cout << "i:" << i << endl;
return i;
} } return -;
} void DFS(int index, int cur)
{
if (cur > ans) ans = cur; for (int i = ; i < * n; i++)
{
int con = ;
int check = is_contain(words[index], words[i], con);
//cout << "check:" << check << "\tcon:" << con << endl; if (!vis[i] && check >= )
{
//cout << "a:" << words[index] << "\tb:" << words[i] << "\tcur:" << cur << "\tres:" << cur + words[i].length() - con << endl;
vis[i] = ;
DFS(i, cur + words[i].length() - con);
vis[i] = ;
}
}
} int main()
{
while (cin>>n)
{
for (int i = ; i < n; i++)
{
cin >> words[i];
words[n + i] = words[i];
}
cin >> ch; ans = ;
memset(vis, , sizeof(vis));
for (int i = ; i < * n; i++)
{
if (words[i][] == ch)
{
vis[i] = ;
DFS(i, words[i].length());
vis[i] = ;
}
} cout << ans << endl;
} } //注意点:<iostream>头文件写在最前面!!!
//思路:计算每个单词之间的相同部分,然后DFS
//#include <iostream>
//#include <cstdio>
//#include <string>
//#include <cstring>
//#include <algorithm>
//using namespace std;
//
//#define MAX 100
//int n, ans, vis[MAX], map[MAX][MAX];
//string words[MAX];
//char ch;
//
//
//int get_length(string a, string b)
//{
// //cout << "=================a:" << a << "\tb:" << b << "==================" << endl;
// int a_len = a.length(), b_len = b.length();
// int len = min(a_len, b_len);
// for (int i = 0; i < len; i++)
// {
// string at = a.substr(a_len - i - 1);
// string bt = b.substr(0, i + 1);
// //cout << "at:" << at << "\tbt:" << bt << endl;
// if (at == bt)
// {
// //cout << "con:" << b.length() - i - 1 << endl;
// return b.length() - i - 1;
// }
// }
//
// return 0;
//}
//
//void DFS(int index, int cur)
//{
// if (cur > ans) ans = cur;
//
// for (int i = 0; i < n; i++)
// {
// if (vis[i] < 2 && map[index][i])
// {
// vis[i] ++;
// DFS(i, cur + map[index][i]);
// vis[i] --;
// }
// }
//}
//
//int main()
//{
// while (cin>>n)
// {
// for (int i = 0; i < n; i++)
// cin >> words[i];
// cin >> ch;
//
// ans = 0;
// memset(vis, 0, sizeof(vis));
// memset(map, 0, sizeof(map));
// for (int i = 0; i < n; i++)
// for (int j = 0; j < n; j++)
// map[i][j] = get_length(words[i], words[j]);
//
// for (int i = 0; i < n; i++)
// {
// if (words[i][0] == ch)
// {
// vis[i] ++;
// DFS(i, words[i].length());
// vis[i] --;
// }
// }
//
// cout << ans << endl;
// }
// return 0;
//}

ACM-单词接龙的更多相关文章

  1. NOIP2000单词接龙[DFS]

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  2. Noip2000 T3 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  3. 洛谷 P1019 单词接龙 Label:dfs

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  4. 【wikioi】1018 单词接龙

    题目链接 算法:DFS+考你阅题 题目描述: 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中 ...

  5. NOIP2000 单词接龙

    题三.  单词接龙                (27分)    问题描述    单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的 ...

  6. 1172: 单词接龙(XCOJ 暴力DFS)

    1172: 单词接龙 时间限制: 1 Sec  内存限制: 128 MB提交: 12  解决: 5 标签提交统计讨论版 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词 ...

  7. 单词接龙(dragon)

    单词接龙(dragon) 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ...

  8. NOIP2000提高组 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的"龙"(每个单词都最多在"龙" ...

  9. 洛谷 P1019 单词接龙【经典DFS,温习搜索】

    P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在 ...

  10. 洛谷 p1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

随机推荐

  1. Linux设备树学习

    1.概念 设备树用于实现驱动代码与设备信息相分离.驱动代码只负责处理驱动的逻辑而关于设备的具体信息存放到设备树文件中.(dts文件,编译后为dtb文件).一个dts文件对应一个ARM的machine, ...

  2. 注册模块上线前安全测试checklist

    许多应用系统都有注册模块,正常用户通过注册功能,获得应用系统使用权限:而非法用户通过注册模块,则是为了达到不可告人的目的,非法用户可以通过注册模块与服务端进行交互(一切用户输入都不可信),因此系统上线 ...

  3. vue移动端transition兼容

    vue移动端transition兼容 .face-recognition .wrapper(:style="{height: viewHeight+'px'}") .face-re ...

  4. Doxygen 注释语法规范

    背景 这一块的内容更多的是作为了解,但是可以以这样的规范作为自己的编程注释习惯,提高自己的软实力. Doxygen注释语法 注释格式 块注释建议统一使用 /** -- ***/ 行注释建议统一使用 / ...

  5. sessionManager配置

    在sessionManager配置的时候,有两个属性, 在这个类中,cacheManager是要注入到sessionDao中的,但要求sessionDao实现CacheManagerAware接口 C ...

  6. BlackArch-Tools

    BlackArch-Tools 简介 安装在ArchLinux之上添加存储库从blackarch存储库安装工具替代安装方法BlackArch Linux Complete Tools List 简介 ...

  7. LCA之tarjan离线

    显然81篇题解是有点多了,不让我提交. 更为不好的是没有一篇详细的\(tarjan\)(不过我也不会写详细的). 不过\(tarjan\)并没有我们想象的那样难理解,时间也并不爆炸(巧妙的跳过难写二字 ...

  8. oracle进入CDB

    第一步:使用sys登陆 CONN sys/change_on_install AS SYSDBA; 第二步:查看现在的容器名称 SHOW con_name; 第三步:改变容器为PDB ALTER SE ...

  9. 十八、React react-router4.x中:实现路由模块化、以及嵌套路由父子组件传值

    一.路由模块化(用字典定义路由,然后循环出来) 1.官方文档参考 [官方文档]https://reacttraining.com/react-router/web/guides/quick-start ...

  10. 关于http的两种上传方法

    http传输数据GET和POST的两种方法: 1.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示. 2.get方式传递的参数可以在URL上看见,安全性不高,反之post安全 ...