题目链接https://www.luogu.com.cn/problem/P1019
最短代码
思路各位大佬都已经讲的很清楚了,本蒟蒻就不在赘述。
大家主要还是不知道如何接龙,这里我将用一个神奇的方法缩短代码
(好吧其实就是介绍一个函数
正式开始
substr函数(请开始你的表演
这个函数有什么用呢(听名字显然是找子字符串
函数原型substr(pos,count)
pos - 要包含的首个字符的位置
count - 子串的长度
就是直接截取pos到pos+count-1的部分作为字符串
举个栗子
string a=“0123456789”;
string b=a.substr(5,2);
b就是“56” 注意pos的位置相当于从左往右数第六个开始不是第五个开始
当然作为神奇的函数他当然还有另一个用法(没想到吧
可以直接省掉后面那个参数,一直到截取到最后即可
继续举个栗子
string a=“0123456789”;
string b=a.substr(5);
b就是“56789”
下面是44行未压缩代码
#include<bits/stdc++.h>
using namespace std;
int n,i,j,k,prime[30],ans;
char ch;
string s[20];
void dfs(string x,int len)//x表示上一次的字符串,len表示总长度
{
ans=max(ans,len);//更新最大值
for(int i=1;i<=n;i++)
{
int len1=x.length(),len2=s[i].length();
for(int j=1;j<min(len1,len2);j++)//因为题目要求不能重合
{
if(x.substr(len1-j)==s[i].substr(0,j)&&prime[i]<2)//运用函数,prime[i]为判断数组不能使用两次
{
prime[i]++;
dfs(s[i],len+len2-j);
prime[i]--;
break;
}
}
}
return ;
}
int main()
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>s[i];
}
cin>>ch;
for(i=1;i<=n;i++)
{
if(s[i][0]==ch)//如果第一个字符是ch开始dfs
{
prime[i]++;
dfs(s[i],s[i].size());
prime[i]--;
}
}
cout<<ans;
return 0;
}
蒟蒻第一篇题解,点个赞再走呗(逃
来源:CSDN
作者:hxwz acmer
链接:https://blog.csdn.net/m0_46209312/article/details/104302669