模式匹配去年的 codejam round 1A解决方案不起作用

问题描述

我正在尝试去年第 1A 轮的 codejam 问题

link to question

我已经提交了这个代码(为了方便,从main方法开始阅读)-

#include <bits/stdc++.h>

using namespace std;

#define range(t) for (int i = 0; i < t; i++)
#define rangeG(i,t) for (i = 0; i < t; i++)
#define printVec(vec)      \
    for (auto c : vec)     \
    {                      \
        cout << c << endl; \
    }

vector<string> separate(string s)
{
    vector<string> result;
    range(s.size())
    {
        if (s[i] == '*')
        {
            string temp = s.substr(0,i + 1);
            if (temp.size() > 1)
            {
                result.push_back(temp);
            }
            s = s.substr(i,s.size());
            i = 0;
        }
        else if (i == (s.size() - 1))
        {
            string temp = s.substr(0,i + 1);
            result.push_back(temp);
            s = s.substr(i,s.size());
        }
    }
    return result;
}

void removeAsterisk(string &s)
{
    s.erase(remove(s.begin(),s.end(),'*'),s.end());
}

bool setStart(string s,string &start)
{
    bool possible = 1;
    removeAsterisk(s);
    range(min(s.size(),start.size()))
    {
        if (s[i] != start[i])
        {
            possible = 0;
        }
    }

    if (possible)
    {
        if (s.size() >= start.size())
        {
            start = s;
        }
    }

    return possible;
}

bool setEnd(string s,string &end)
{
    bool possible = 1;
    removeAsterisk(s);
    range(min(s.size(),end.size()))
    {
        if (s[s.size() - 1 - i] != end[end.size() - 1 - i])
        {
            possible = 0;
        }
    }

    if (possible)
    {
        if (s.size() >= end.size())
        {
            end = s;
        }
    }

    return possible;
}

void solve()
{
    int n;
    cin >> n;

    vector<string> allS;
    bool possible = 1;

    string start = "";
    string end = "";
    string middle = "";
    string result = "";

    while (n--)
    {
        string str;
        cin >> str;
        if (count(str.begin(),str.end(),'*') == 0)
        {
            result = str;
        }
        vector<string> temp = separate(str);
        for (string s : temp)
        {
            if (s[0] != '*')
            {
                possible = setStart(s,start);
            }
            if (s[s.size() - 1] != '*')
            {
                possible = setEnd(s,end);
            }
            if (possible && count(s.begin(),'*') == 0)
            {
                result = s;
                break;
            }
            if (s[0] == '*' && s[s.size() - 1] == '*')
            {
                removeAsterisk(s);
                middle += s;
            }
        }
    }

    if (possible)
    {
        if (result.size() == 0)
        {
            result = start + middle + end;
        }
        cout << result << "\n";
    }
    else
    {
        cout << "*\n";
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t = 0;
    cin >> t;
    range(t)
    {
        cout << "Case #" << i + 1 << ": ";
        solve();
    }
    return 0;
}

这对我来说似乎是正确的,我已经对许多示例进行了多次测试,但是它在测试集 1 中丢失了(正好是一个 *(星号)字符,并且始终是字符串的第一个字符)。谁能告诉我出了什么问题? 您可以考虑排名第一的代码 here (它具有所有解决方案,仅检查“模式匹配”任务)寻求帮助。我知道错误答案是一种边缘情况,如果它通过了测试集 1,那么它将通过其他测试集。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)