为啥样例和第一个测试点过了,交上去却是全WA
#include <bits/stdc++.h>
using namespace std;
// 存储单词的字符串数组
string s[300];
// 存储单词之间连接关系的向量数组
vector< pair<int, int> > d[30];
// 连接的长度
int con;
// 单词数量
int n;
// 最终答案
int ans;
// 记录每个单词被使用的次数
int p[30];
// 判断两个单词是否可以连接的函数
bool f(int x, int y) // 判断 s[x] 的头和 s[y] 的尾是否相合
{
for(int i = 0; i < min(s[x].size(), s[y].size()); i++) // 比较 s[x] 和 s[y] 的部分字符
{
bool pd = 1; // 标记是否匹配
for(int lx = 0; lx <= i; lx++) // 逐个字符比较
if(s[x][lx]!= s[y][s[y].size() - i - 1 + lx]) // 不匹配则标记为不匹配
{
pd = 0;
break;
}
if(pd) // 匹配则记录连接长度并返回真
{
con = i + 1;
return 1;
}
}
return 0; // 不匹配返回假
}
// 深度优先搜索函数
void dfs(int sop, int dep) // sop 为当前节点,dep 为当前深度
{
ans = max(ans, dep); // 更新最大深度
for(int i = 0; i < d[sop].size(); i++) // 遍历当前节点的连接关系
{
int lx = d[sop][i].first; // 获取连接的单词索引
if(p[lx] < 2) // 如果使用次数小于 2 次
{
p[lx]++; // 对应单词使用次数加 1
dfs(lx, dep + s[lx].size() - d[sop][i].second); // 递归搜索
p[lx]--; // 回溯,恢复使用次数
}
}
}
int main()
{
cin >> n; // 输入单词数量
getline(cin, s[0]); // 读取一行
for(int i = 1; i <= n + 1; i++) // 读取每个单词
getline(cin, s[i]);
for(int i = 1; i <= n + 1; i++) // 构建单词连接关系
for(int j = i; j <= n + 1; j++)
{
// 如果两个单词可以连接,添加连接关系到对应向量
if(f(i, j) && ((j == n + 1 && i!= j) || (con!= s[i].size() && con!= s[j].size())))
d[j].push_back(make_pair(i, con));
if(i!= j && f(j, i) && ((i == n + 1 && i!= j) || con!= s[i].size() && con!= s[j].size())))
d[i].push_back(make_pair(j, con));
}
dfs(n + 1, 1); // 从最后一个单词开始深度优先搜索
cout << ans << endl; // 输出最大长度
return 0;
}