有注释求助
查看原帖
有注释求助
257173
rish楼主2024/8/1 15:59

为啥样例过了,第一个测试点也过了,但是交上去就是全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;  // 获取连接的单词索引
        p[lx]++;  // 对应单词使用次数加 1
        if(p[lx] <= 2)  // 如果使用次数不超过 2 次
            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;
}
2024/8/1 15:59
加载中...