gpt4 book ai didi

c++ - 为什么我的代码中出现 'Runtime Error - SIGSEGV'?

转载 作者:行者123 更新时间:2023-11-30 03:14:49 26 4
gpt4 key购买 nike

我有一些不可能的问题要问你! (或者他们是?;))

你有 n长度为 m 的二进制数. i th 二进制数是 Bi。此外,您必须执行 q对他们的查询。索引从零开始,位的索引从左开始。

查询类型:a , i , j .
如果a是:

  • 0 : Bi和Bj逻辑与,输出1的个数s 在结果中。
  • 1 : 对Bi和Bj进行逻辑或运算,输出1的个数s 在结果中。
  • 2 :对Bi和Bj进行逻辑异或运算,输出1的个数s 在结果中。
  • 3 : 翻转 j 的值Bith 位(即如果该位等于 0,则将该位设置为 1,反之亦然)。

注意:对于 0 类型的查询, 1 , 和 2 , 二进制数保持不变。

也推荐C++和JAVA程序员使用Fast I/O。


输入格式:

第一行包含整数 nm .
下一个n行包含长度为 m 的二进制数.
i th 行包含二进制数 Bi
下一行包含一个整数 q
下一个q行包含类型的查询:a , i , j .

输出格式:

输出数1 s 在类型 0 的结果中, 12查询。

限制条件:
1<=n , m<=2500
1<=q<=10^6

我已经尝试更改数组大小,但错误仍然存​​在!

#include <iostream>
#include <math.h>
#include <bits/stdc++.h>
using namespace std;


int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,m;
cin>>n>>m;
char arr[3000][3000];

for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>arr[i][j];
}


long int q;
cin>>q;
char query[3000][3000];
for(long int k=0;k<q;k++)
for(long int l=0;l<3;l++)
{
cin>>query[k][l];
}


for(long int i=0;i<q;i++)
{
if(int(query[i][0]-48)==3)
{
if(arr[int(query[i][1])-48][int(query[i][2])-48]=='1')
{
arr[int(query[i][1])-48][int(query[i][2])-48]='0';
}
else
{
arr[int(query[i][1])-48][int(query[i][2])-48]='1';
}
}

else if(int(query[i][0]-48)==2)
{
int cntr=0;
int bi=int(query[i][1])-48;
int bj=int(query[i][2])-48;

for(int i=0;i<m;i++)
{
int xorres=arr[bi][i]^arr[bj][i];
if(xorres==1)
cntr++;
}
cout<<cntr<<endl;
}

else if(int(query[i][0]-48)==1)
{
int cntr=0;
int bi=int(query[i][1])-48;
int bj=int(query[i][2])-48;

for(int i=0;i<m;i++)
{
int andres=arr[bi][i]|arr[bj][i];
if(andres-48==1)
cntr++;
}
cout<<cntr<<endl;

}

else if(int(query[i][0]-48)==0)
{
int cntr=0;
int bi=int(query[i][1])-48;
int bj=int(query[i][2])-48;

for(int i=0;i<m;i++)
{
int andres=arr[bi][i]&arr[bj][i];
if(andres-48==1)
cntr++;
}
cout<<cntr<<endl;

}
}



return 0;
}

最佳答案

两个char[3000][3000]是您在堆栈上分配的 导致崩溃的原因。

因为 n 没有上限限制你最好尝试在堆上分配它,如果失败则捕获异常。这可以通过使用 std::vector<std::vector<char>> 来完成。相反。

替换:

int n,m;
cin >> n >> m;
char arr[3000][3000];

像这样:

#include <vector>

size_t n, m;
std::vector<std::vector<char>> arr;

while(std::cin >> n >> m) {
try {
arr.resize(n, std::vector<char>(m));
break; // success, break out of the while-loop
} catch(const std::exception& ex) {
// exception caught, most probably a bad_alloc
std::cerr << ex.what() << " ... try again\n";
}
}

正如评论中所建议的那样,您可能不需要存储所有查询。一次只处理一个查询。

此外,从不 #include <bits/stdc++.h>你自己。它是一个非标准/不可移植的头文件,包含的内容很多超出您的需要,而且通常不是您需要的全部。相反,只包含您实际需要的 header 。

同样,using namespace std;considered bad practice .

关于c++ - 为什么我的代码中出现 'Runtime Error - SIGSEGV'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57462244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com