单词接龙(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. [洛谷P2482][SDOI2010]猪国杀

    题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...

  2. 妮可妮可妮 [Hash]

    妮可妮可妮 题目描述 小P特别喜欢动画Love Live中的角色妮可,每当他听到妮可说"niconiconi"时,他总会感到特别兴奋,还会露出绅士般的微笑. 作为一名理论计算机科学 ...

  3. POJ3259:Wormholes(spfa判负环)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 68097   Accepted: 25374 题目链接: ...

  4. B. Minimum Ternary String (这个B有点狠)

    B. Minimum Ternary String time limit per test 1 second memory limit per test 256 megabytes input sta ...

  5. 使用vue做移动app时,调用摄像头扫描二维码

    现在前端技术发展飞快,前端都能做app了,那么项目中,也会遇到调用安卓手机基层的一些功能,比如调用摄像头,完成扫描二维码功能 下面我就为大家讲解一下,我在项目中调用这功能的过程. 首先我们需要一个中间 ...

  6. Android百度定位地图使用--文章集锦

    Android百度定位API使用方法 Android百度地图开发(一)之初体验 AndroidNote013.在百度地图上画出轨迹 Android学习笔记之百度地图(分条目覆盖物:ItemizedOv ...

  7. HDU 5685 Problem A | 快速幂+逆元

    Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  8. codeforces B. Okabe and Banana Trees 结论题

    题目传送门 这道题 枚举一波y就好了 要求x,y整数 所以y最多1000个 然后算一波答案更新就好了 233 #include<cstdio> #include<cstring> ...

  9. bzoj 3196二逼平衡树 线段树套平衡树

    比较裸的树套树,对于区间K值bz上有一道裸题,详见题解http://www.cnblogs.com/BLADEVIL/p/3455336.html(其实题解也不是很详细) //By BLADEVIL ...

  10. Emmet 也有快速生成文件头的功能

    输入下边加粗的缩写,然后Tab,就OK了http://docs.emmet.io/cheat-sheet/ html:4t <!DOCTYPE HTML PUBLIC "-//W3C/ ...