单词接龙(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 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
随机推荐
- BZOJ3456 城市规划 【多项式求逆】
题目链接 BZOJ3456 题解 之前我们用分治\(ntt\)在\(O(nlog^2n)\)的复杂度下做了这题,今天我们使用多项式求逆 设\(f_n\)表示\(n\)个点带标号无向连通图数 设\(g_ ...
- BZOJ2115 [Wc2011] Xor 【线性基】
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MB Submit: 3915 Solved: 1633 [Submit][Stat ...
- C. Annoying Present SB题
C. Annoying Present time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Http/2 升级指南
[转]http://www.syyong.com/architecture/http2.html HTTP/2(最初名为HTTP/2.0)是 WWW 使用的 HTTP 网络协议的主要版本. 它来自早先 ...
- 使用FindBugs-IDEA插件找到代码中潜在的问题
另一篇使用文档,参照:https://www.cnblogs.com/huaxingtianxia/p/6703315.html 我们通常都会在APP上线之后,发现各种错误,尤其是空指针异常,这些错误 ...
- 【BZOJ2338】【HNOI2011】数矩形 [计算几何]
数矩形 Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 最近某歌手在研究自己的全国巡回演出, ...
- [bzoj4602][Sdoi2016]齿轮——dfs
题目 现有一个传动系统,包含了N个组合齿轮和M个链条.每一个链条连接了两个组合齿轮u和v,并提供了一个传动比x : y.即如果只考虑这两个组合齿轮,编号为u的齿轮转动x圈,编号为v的齿轮会转动y圈.传 ...
- Google Intern
申请 事情应该从去年(2013)说起,好基友从百度离职跳到了Google,回学校打印本科成绩单,然后晚上在scuacm群里,结果Dr. zuo问我想去实习么,正好有学长可以内推. 于是乎写了简历,然后 ...
- python发布包到pypi的踩坑记录
前言 突然想玩玩python了^_^ 这篇博文记录了我打算发布包到pypi的踩坑经历.python更新太快了,甚至连这种发布上传机制都在不断的更新,这导致网上的一些关于python发布上传到pypi的 ...
- Launcher3无图标问题
MTK8382/8121平台. 机器(8寸,默认竖屏)第一次烧录完成后,以横放姿势启动,发现Launcher没有图标,而竖屏启动是没有这个问题的.在测试过程中发现,在设置中clear data后也会有 ...