# P1019 [NOIP2000 提高组] 单词接龙
题目:
思路:
循环判断,首字母为"龙"开头的字母开始搜索, i s s t r is_str isstr函数判断有没有重叠区间(能不能接上),能的话就接上再搜索
v a l val val始终维护历史最长长度
注意每个字符串可以用两次,所以判断的时候注意不是等于 0 0 0才能用
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAX = 1e5 + 5;
string str[25];
int len;
int BL[25];
char H;//头
int val = 0;//最大长度
int is_str(string A, string B) {//检测重叠取余长度
int lenA = A.size(), lenB = B.size();
for (int i = 1; i<lenA&&i<lenB; i++) {
int mark = 1;
for (int o = 0; o < i; o++) {
if (A[lenA - i + o] != B[o]) {
mark = 0;
break;
}
}
if (mark) {
return i;
}
}
return 0;
}
void dfs(string sum, int N) {
if (N > val) {
val = N;
}
for (int i = 1; i <= len; i++) {
if (BL[i] < 2) {
int len = is_str(sum, str[i]);
if (len) {
BL[i]++;
dfs(str[i], N + str[i].length() - len);
BL[i]--;
}
}
}
}
int main() {
cin >> len;
for (int i = 1; i <= len; i++) cin >> str[i];
cin >> H;
for (int i = 1; i <= len; i++) {
if (str[i][0] == H) {
BL[i] = 1;
dfs(str[i], str[i].size());
BL[i] = 0;
}
}
cout << val << endl;
return 0;
}