为什么我在这段代码中收到 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
但是,我尝试使用以下输入编写代码:
尝试
$./测试
输入 2
输入哈
输出 0
输入lo
输出0
=> 没有崩溃
尝试
$./测试
输入 2
输入哈
输出 0
输入lo
输出 0
=> 没有崩溃
尝试
$./测试
输入 2
输入一个
在抛出 'std::out_of_range' 的实例后调用终止
what(): basic_string::substr: __pos (即 2) > this->size() (即 0)
已中止(核心已转储)
那么让我们来分析一下你的代码。当字符串 n 的大小为 1 时,它似乎会崩溃。
在你的 substr 调用中有很多硬编码的整数,如果字符串具有所需的长度(又名 substr(...,2))
我已经在 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
但是,我尝试使用以下输入编写代码:
尝试
$./测试
输入 2
输入哈
输出 0
输入lo
输出0 => 没有崩溃
尝试
$./测试
输入 2
输入哈
输出 0
输入lo
输出 0
=> 没有崩溃
尝试
$./测试
输入 2
输入一个
在抛出 'std::out_of_range' 的实例后调用终止 what(): basic_string::substr: __pos (即 2) > this->size() (即 0) 已中止(核心已转储)
那么让我们来分析一下你的代码。当字符串 n 的大小为 1 时,它似乎会崩溃。
在你的 substr 调用中有很多硬编码的整数,如果字符串具有所需的长度(又名 substr(...,2))