C++ 为什么我会得到一个';运行时错误-SIGSEGV';在我的代码里?
我有一些不可能的问题要问你!(或者他们是?;)) 您有长度为C++ 为什么我会得到一个';运行时错误-SIGSEGV';在我的代码里?,c++,arrays,segmentation-fault,runtime,C++,Arrays,Segmentation Fault,Runtime,我有一些不可能的问题要问你!(或者他们是?;)) 您有长度为m的n二进制数。ith二进制数是Bi。此外,您还必须对它们执行q查询。索引是从零开始的,位的索引从左开始 查询类型为:a、i、j 如果a为: 0:在Bi和Bj之间执行逻辑与运算,并在结果中输出1s的数量 1:在Bi和Bj之间执行逻辑或运算,并在结果中输出1s的数量 2:在Bi和Bj之间执行逻辑异或运算,并输出结果中1s的数目 3:翻转Bi的j第位的值(即,如果该位等于1,则将该位设置为0,反之亦然) 注意:对于类型为0、1和2的查询
m
的n
二进制数。i
th二进制数是Bi。此外,您还必须对它们执行q
查询。索引是从零开始的,位的索引从左开始
查询类型为:a
、i
、j
如果
a
为:
:在Bi和Bj之间执行逻辑与运算,并在结果中输出0
s的数量1
:在Bi和Bj之间执行逻辑或运算,并在结果中输出1
s的数量1
:在Bi和Bj之间执行逻辑异或运算,并输出结果中2
s的数目1
:翻转Bi的3
第位的值(即,如果该位等于j
,则将该位设置为1
,反之亦然)0
0
、1
和2
的查询,二进制数保持不变
<> P>也建议使用C++和java程序员的快速I/O。< /P>
输入格式: 第一行包含整数
n
和m
接下来的
n
行包含长度为m
的二进制数i
th行包含二进制数Bi。下一行包含一个整数
q
接下来的
q
行包含以下类型的查询:a
,i
,j
输出格式:
在类型0
、1
和2
查询的结果中输出1
s的数量
约束条件:1m;
char arr[3000][3000];
对于(int i=0;iarr[i][j];
}
长整数;
cin>>q;
字符查询[3000][3000];
for(long int k=0;kquery[k][l];
}
对于(long int i=0;i好的,我认为这里有些事情很复杂。
查询的大小为10^6,您将数组声明为查询[3000][3000]。
现在,我认为您不需要存储这些查询。
cin>>q;
while(q--)
{
cin>>a>>i>>j;
/*Your code here*/
}
问题说明查询的形式为:AIJ
因此,例如,如果要对前2个字符串执行操作0,则查询将为:
0 1 2
但是您正在存储索引0中的二进制数!
因此,您的代码将对第二个和第三个查询执行操作。因此,您需要做的是从i和j的值中减去1。您在堆栈上分配的两个char[3000][3000]
,就是崩溃的原因
由于n
没有上限约束,因此最好尝试在堆上分配它,并在异常失败时捕获异常。这可以通过使用std::vector
来实现
替换:
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";
}
}
#包括
尺寸n,m;
std::载体arr;
而(标准::cin>>n>>m){
试一试{
arr.resize(n,std::vector(m));
break;//成功,打破while循环
}捕获(const std::exception&ex){
//捕获异常,很可能是错误的分配
std::cerr局部变量(包括数组)由编译器放置在堆栈上。堆栈是一个有限的资源,在Linux上是8MB。现在想想数组arr
…它需要多少空间?同时arr
和query
需要多少空间?是时候了解了。以及。在线评委/竞赛网站对beginne来说真的不好还有,标准:,和。在处理查询之前,您不需要存储所有查询。一次一个。使用向量向量作为输入。(或者使用静态数组,如果您绝对必须使用数组。)此外,'0'
既可移植又可理解;48
不是。
#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";
}
}