题目传送门: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 long struct node { int l,vis; ]; } c[]; ; using namespace std; void dfs(int x,int l)//x为当前连接好的单词的最后一个单词编号,l为 目前龙的长度 { FOR(i,,n)//枚举每个单词的编号 { )//一个单词最多被用两次 FOR(j,,c[x].l) { ]) { ; ; ; d<c[x].l&&k<c[i].l; k++,d++) { if(c[x].s[d]!=c[i].s[k]) { flag=; 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,,n) { scanf("%s",c[i].s); c[i].l=strlen(c[i].s); } scanf(].s); c[].l=strlen(c[].s); dfs(,c[].l); printf("%d",maxn); ; }