单词接龙(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)的更多相关文章

  1. 单词接龙(dragon)

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

  2. Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder)

    Leetcode之广度优先搜索(BFS)专题-127. 单词接龙(Word Ladder) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary Tre ...

  3. Leetcode 126.单词接龙II

    单词接龙II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: 每次转换只能 ...

  4. 洛谷——P1019 单词接龙(NOIP2000 T3)

    https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...

  5. LeetCode 126. Word Ladder II 单词接龙 II(C++/Java)

    题目: Given two words (beginWord and endWord), and a dictionary's word list, find all shortest transfo ...

  6. Java实现 LeetCode 127 单词接龙

    127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...

  7. Java实现 LeetCode 126 单词接龙 II

    126. 单词接龙 II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列.转换需遵循如下规则: ...

  8. NOIP2000单词接龙[DFS]

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

  9. Noip2000 T3 单词接龙

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

随机推荐

  1. [NOIP2018 TG D2T2]填数游戏

    题目大意:$NOIP2018\;TG\;D2T2$ 题解:在skip2004的博客基础上修改的,也是暴搜. 说明一下把vector改成数组并不可以通过此题,记录. 结论:在$m>n+1$时答案为 ...

  2. Flink 任务打包、提交

    一.Flink版本 flink-1.6.1-bin-hadoop26-scala_2.11 二.Flink任务打包 笔者将写好的flink计算任务代码发到服务器(ubuntu16.04),在服务器端进 ...

  3. cdq分治入门学习 cogs 1752 Mokia nwerc 2015-2016 G 二维偏序

    /* CDQ分治的对象是时间. 即对于一个时间段[L, R],我们取mid = (L + R) / 2. 分治的每层只考虑mid之前的修改对mid之后的查询的贡献,然后递归到[L,mid],(mid, ...

  4. 洛谷 P2444 [POI2000]病毒 解题报告

    P2444 [POI2000]病毒 题目描述 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们就称这段代码是安全的.现在委员会已 ...

  5. SCOI 股票交易 单调队列优化dp

    这道题 我很蒙.....首先依照搞单调队列优化dp的一般思路 先写出状态转移方程 在想法子去优化 这个题目中说道w就是这一天要是进行操作就是从前w-1天转移而来因为之前的w天不允许有操作!就是与这些天 ...

  6. [cdoj 1344]树状数组区间加等差数列

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1344 区间加等差数列本质上就是区间修改区间查询,本来想用线段树做,结果这个题就是卡空间和时间……不得已学了区 ...

  7. ubuntu安装GraphicsMagick

    一. sudo apt-get install graphicsmagick 二. http://www.cnblogs.com/cocowool/archive/2010/08/16/1800954 ...

  8. P值

    https://baike.baidu.com/item/P%E5%80%BC/7083622?fr=aladdin https://baijiahao.baidu.com/s?id=15960976 ...

  9. karma和jasmine的测试(包括angular测试)

    本篇博客主要就是针对现在日新月异的技术和快速开发,测试被很多人忽略,其实在开发中如何保证代码的质量以及逻辑的完整性,测试显得十分重要,本文就是负责karma+jasmine来测试. 1.搭建测试的环境 ...

  10. 转:Android 的一些比较好的开源代码项目

    转自:http://blog.csdn.net/zengyangtech/article/details/7019439 Android PDF 阅读器 http://sourceforge.net/ ...