这道题挺有意思,没看见怎么用substr的,来发一波。
首先,我们的知道substr的一种用法,比较多的都是两个参数,但其实,一个参数也可以。
如下:
我们在此处用的就是第1种方法。
### 不过要注意,一个单词只能用两次,一开始没看见,狂交10次。
所以我们要定义一个数组来看它是否被用了超过两次以上。
DFS与回溯。
如下:
#include<bits/stdc++.h>
using namespace std;
int maxlen=0;
int newlen=0;
int n;
string str[22];
int ok[22];//判断是否出现了2次。
int pipei(string &str1,string &str2) {
if(str1.length()==1) {
if(str2[0]==str1[0])
return str2.length();//如果是开头的字母就直接返回准备匹配的单词的长度
return 0;
} else {
for(int i=1; i<str1.length(); i++) {
string temp1=str1.substr(str1.length()-i);//substr如果只有一个参数,返回从参数开始到结尾
string temp2=str2.substr(0,i);
if(temp1==temp2)
return str2.length()-i;//如果相等,传回长度
}
}
return 0;
}
void dfs(string &s) {//取地址符号以改变原来的字符串。
for(int i=0; i<n; i++) {
int temp=pipei(s,str[i]);//pipei中传回的是新的长度
if(temp && ok[i]<2) {
ok[i]++;
newlen+=temp;
if(newlen>maxlen) maxlen=newlen;//改变长度
dfs(str[i]);
ok[i]--;
newlen-=temp;//回溯
}
}
}
int main() {
cin>>n;
for(int i=0; i<n; i++)
cin>>str[i];
string cr;
cin>>cr;//开头首字母。
dfs(cr);
cout<<maxlen<<endl;
return 0;
}