为什么我在这段代码中收到 SIGABRT 错误

Why am i getting a SIGABRT error in this code

我已经在 CodeChef 中编写了这段代码,但它不断给我一个名为 (SIGABRT) 的运行时错误。我一直在努力解决这个问题,但没有结果。我已经最大限度地减少了记忆。我需要帮助。

有N位同学站成一排,从左到右依次编号为1到N。给定一个长度为 N 的字符串 S,其中对于每个有效的 i,如果第 i 个学生是女孩,则 S 的第 i 个字符为 'x',如果该学生是男孩,则为 'y' .站在一起的同学是朋友。

学生们被要求组队参加舞蹈比赛。每对必须由一个男孩和一个女孩组成。两个学生只有成为朋友才能结成一对。每个学生最多只能是一对的一部分。最多可以组成多少对?

示例输入 3个 xy xyxxy yy

示例输出 1个 2个 0

说明 示例案例 1:只有一对可能:(第一个学生,第二个学生)。

例题2:形成一对的方法之一是:(第一学生,第二学生)和(第四学生,第五学生)。

另一种组成二人组的方法是:(二学生,三学生)和(四学生,五学生)。

#include <iostream>
#include <string>
#define rp(l,p) for(int l = 0; l < p; l+=2)
#define s string 
#define ll long long
using namespace std;

int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    // your code goes here
    int t = 0;
    cin >> t;
    while(t--){
        s n = "";
        ll max = 0;
        cin >> n;
        if(n.size()%2 == 0){
            rp(l, n.size()-1){
                if(n.substr(0+l, 2) == "xy" || n.substr(0+l, 2) == "yx"){
                    max+=1;
                }
            }
        }
        else if(n.size()%2 == 1){
            s x = n.substr(n.size()-1, 1);
            n.resize(n.size()-1);
            for(int m = 0; m <= (n.size()-1); m+=2){
                if(n.substr(0+m, 2) == "xy" || n.substr(0+m, 2) == "yx"){
                    max+=1;
                }
            }
            n.append(x);
            if(n.substr(n.size()-3,2) == "xy" || n.substr(n.size()-3,2) == "yx"){

            }
            else if(n.substr(n.size()-2,2) == "xy" || n.substr(n.size()-2,2)=="yx"){
                max+=1;
            }
        }
        cout << max << endl;
    }
    return 0;
}

我完全同意@Sam Varshavchik

但是,我尝试使用以下输入编写代码:

  1. 尝试

    $./测试

    输入 2

    输入哈

    输出 0

    输入lo

    输出0 => 没有崩溃

  2. 尝试

    $./测试

    输入 2

    输入哈

    输出 0

    输入lo

    输出 0

=> 没有崩溃

  1. 尝试

    $./测试

    输入 2

    输入一个

    在抛出 'std::out_of_range' 的实例后调用终止 what(): basic_string::substr: __pos (即 2) > this->size() (即 0) 已中止(核心已转储)

那么让我们来分析一下你的代码。当字符串 n 的大小为 1 时,它似乎会崩溃。

在你的 substr 调用中有很多硬编码的整数,如果字符串具有所需的长度(又名 substr(...,2))