首页 > 代码库 > 单次接龙dfs洛谷
单次接龙dfs洛谷
题目传送门:https://www.luogu.org/problem/show?pid=1019#sub
典型的爆搜,每次更新最大龙长度即可
搜索每个字符串编号,与已经连接好的字符串进行比较,以此往后找,若全部匹配,则可以接龙
注意:
1.自己也可以与自己相连
2.题目中所说的不能存在包含关系是连接好后的相邻两部分 并不是如果是子串就不能连接 否则第一个单词即起始字母无法连接
//Gang#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cmath>#define FOR(x,y,z) for(int x=y;x<=z;x++)#define ll long longstruct node{ int l,vis; char s[25];} c[25];int n,maxn=0;using namespace std;void dfs(int x,int l)//x为当前连接好的单词的最后一个单词,l为 目前龙的长度{ FOR(i,1,n)//枚举每个单词的编号 { if(c[i].vis<2)//一个单词最多被用两次 FOR(j,0,c[x].l) { if(c[x].s[j]==c[i].s[0]) { int k=1; bool flag=1; for(int d=j+1; d<c[x].l&&k<c[i].l; k++,d++) { if(c[x].s[d]!=c[i].s[k]) { flag=0; break; } } if(flag) { c[i].vis++; dfs(i,l+c[i].l-k); c[i].vis--; } } } } if(l>maxn)maxn=l;}int main(){ scanf("%d",&n); FOR(i,1,n) { scanf("%s",c[i].s); c[i].l=strlen(c[i].s); } scanf("%s",c[0].s); c[0].l=strlen(c[0].s); dfs(0,c[0].l); printf("%d",maxn); return 0;}
单次接龙dfs洛谷
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。