单词接龙(dragon)(BFS)
单词接龙(dragon)
时间限制: 1 Sec 内存限制: 64 MB
提交: 12 解决: 5
[提交][状态][讨论版]
题目描述
单
词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在
“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻
的两部分不能存在包含关系,例如at和atide间不能相连。
输入
第1行为一个单独的整数n(n≤20),表示单词数,以下n行每行有一个单词,输入的最后1行为一个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。
输出
输出以此字母开头的最长的“龙”的长度。
样例输入
5
at
touch
cheat
choose
tact
a
样例输出
23
提示
样例说明:连成的“龙”为atoucheatactactouchoose。
【分析】哎 这个题 一开始WA了好几发 仔细检查发现好多BUG 主要是判断两个字符串相交部分想错了 题目要求最长龙 而我找重复子字符串时 是从
首字符串头部开始遍历找的 导致在有些情况下把重复字符串找长了 例如:(头)CDABABA (尾)BABABA 这个时候重复字符串应该是BA 而不应该
是BABA 哎 还是我太菜 路还长 需要学的还很多 下面是AC代码 可能还可以优化 谁让我太菜 wo te e fa ke?
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define mod 1000000007
typedef long long ll;
using namespace std;
const int N=;
int n,dp[N],len;
int w[][];
int g[];
int b,c;
string str[],ch;
int maxn=;
map<string,int>p,pp;
struct man
{
string sa;
int aa[];
}; int charge(string a,string b)
{
for(int ii=a.size()-;ii>=;ii--)
{
int jj=ii,kk=;
while(jj<a.size()&&kk<b.size())
{
if(a[jj]!=b[kk])break;
jj++;kk++;
}
if(jj==a.size()&&ii!=)return (kk);
else if(jj==a.size()&&ii==) return ;
else if(jj==a.size()&&kk==b.size())return ;
}
} void bfs()
{
queue<man>q;
for(int i=;i<n;i++)
{
if(str[i][]==ch[])
{
man CH;
CH.sa=str[i];
for(int j=;j<=;j++){CH.aa[j]=;if(i==j)CH.aa[i]=;}
q.push(CH);
}
}
while(!q.empty())
{
man t=q.front();
int y=t.sa.size();
maxn=max(maxn,y);
q.pop();
for(int i=;i<n;i++)
{
string l=str[i],k;
if(t.aa[i]>=)continue;
int mm=charge(t.sa,l);
//printf("!!!%d\n",mm);
if(mm==)continue;
else
{
man K=t; K.aa[i]++;
l= l.erase(,mm);
k=t.sa+l;
K.sa=k;
if(pp[k]!=){q.push(K);pp[k]=;}
}
}
}
} int main() {
memset(w,,sizeof(w));
cin>>n;
for(int i=;i<n;i++)
{
cin>>str[i];
p[str[i]]=;
}
cin>>ch;
bfs();
cout<<maxn<<endl;
return ;
}
下面是我们实验室一个大神写的DFS。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include<functional>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 1000005
#define maxn 10005
typedef pair<int,int> PII;
typedef long long LL; int n,m,k,ans,temp;
string str[];
int len[];
int vis[];
int pic[][];
int match(int x,int y){
int res=;
int tlen=min(len[x],len[y]);
for(int i=;i<=tlen;++i){
int j=len[x]-i;k=;
while(j<len[x]&&k<len[y]&&k<i){
if(str[x][j]!=str[y][k])break;
++j;++k;
}
if(k==i){
res=i;
break;
}
}
return res==tlen?:res;
}
void init(){
for(int i=,t;i<=n;++i)
for(int j=;j<=n;++j){
if(t=match(i,j)){
pic[i][j]=t;
}
}
}
void dfs(int x){
if(temp>ans)ans=temp;
for(int i=;i<=n;++i)if(!vis[i]&&pic[x][i]){
temp=temp+len[i]-pic[x][i];
vis[i]=;
dfs(i);
vis[i]=;
temp=temp+pic[x][i]-len[i];
}
}
int main() {
//freopen("in.txt","r",stdin);
int i,j,group;
cin>>n;n<<=;
for(i=;i<=n;i+=){
cin>>str[i];
str[i+]=str[i];
len[i]=len[i+]=str[i].length();
}
char ch;cin>>ch;
init();
ans=;
for(i=;i<=n;++i)if(str[i][]==ch){
temp=len[i];
vis[i]=;
dfs(i);
vis[i]=;
}
cout<<ans<<endl;
return ;
}
单词接龙(dragon)(BFS)的更多相关文章
- 单词接龙(dragon)
单词接龙(dragon) 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ...
- Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)
Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...
- Leetcode 126.单词接龙II
单词接龙II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: 每次转换只能 ...
- 洛谷——P1019 单词接龙(NOIP2000 T3)
https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...
- LeetCode 126. Word Ladder II 单词接龙 II(C++/Java)
题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...
- Java实现 LeetCode 127 单词接龙
127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...
- Java实现 LeetCode 126 单词接龙 II
126. 单词接龙 II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: ...
- NOIP2000单词接龙[DFS]
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- Noip2000 T3 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
随机推荐
- [CF1077C]Good Array
题目大意:一个序列是好的当且仅当有一个数是其它所有数的和,问一个序列可以删掉哪个数变成好的序列.输出所有方案. 题解:发现等于其他数的和的那个数一定是其中最大的,只要排序一下(其实只要找到最大的两个数 ...
- Android 多线程: 完全解析线程池ThreadPool原理&使用
目录 1. 简介 2. 工作原理 2.1 核心参数 线程池中有6个核心参数,具体如下 上述6个参数的配置 决定了 线程池的功能,具体设置时机 = 创建 线程池类对象时 传入 ThreadPoolExe ...
- 纯css实现 switch开关
<!-- 直接看代码,利用了css3兄弟选择器 --><!-- html --> <button class="switch"> <inp ...
- hive连接数
使用hive分析日志作业很多的时候,需要修改mysql的默认连接数 修改方法 打开/etc/my.cnf文件 在[mysqld] 中添加 max_connections=1000 重启mysql ...
- Ecplise添加XML自动提示
这里以struts.xml为例 第一步: 首先找到 struts2的核心jar包,我这里是struts2-core-2.3.20.jar用压缩工具打开或者解压下来
- white-space——处理元素内的空白
定义和用法 white-space 属性设置如何处理元素内的空白.这个属性声明建立布局过程中如何处理元素中的空白符.值 pre-wrap 和 pre-line 是 CSS 2.1 中新增的. 默认 ...
- 【STSRM13】木之本樱
[题意]抽象模型后转化为:给定n个直线,ans+=C(x,4)*8,x为每个经过直线数>=4的点的直线数,不存在平行直线. [算法]数学 [题解] 运用了一个很简单的道理:经过同一个点的线段互相 ...
- HDU 1798 Tell me the area (数学)
题目链接 Problem Description There are two circles in the plane (shown in the below picture), there ...
- asp单页面301跳转
<% Response.Status="301 Moved Permanently"Response.AddHeader "Location", &quo ...
- bzoj 1880 最短路
我们首先知道,答案肯定是最短路图中的某段公共链,那么设(x,y)为x到y的最短路,那么答案为((s1,t1)+(s2,t2)-min((s1,s2)+(t1,t2),(s1,t2),(s2,t1))) ...