为什么我的代码中出现'Runtime ErroR语言 SIGSEGV'?



我有一些不可能的查询要问你!(还是他们? ;) )

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

查询的类型为 :aij
如果a为:

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

注意:对于类型为012的查询,二进制数保持不变。

还建议对C++和 JAVA 程序员使用快速 I/O。


输入格式:

第一行包含整数nm
接下来的n行包含长度为m的二进制数。
i行包含二进制数 Bi
下一行包含一个整数q
接下来的q行包含以下类型的查询:aij

输出格式:

输出类型012查询结果中的1秒数。

约束:
1<=nm<=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 againn";
}
}

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

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

同样,using namespace std;被认为是不好的做法。

好的,所以我认为你在这里使一些事情复杂化。 查询的大小为 10^6,您将数组声明为 query[3000][3000]。 现在,我认为您不需要存储查询。考虑一下——

cin>>q;
while(q--)
{
cin>>a>>i>>j;
/*Your code here*/
}

问题指出查询的形式为:a i j 因此,例如,如果要对前 2 个字符串执行操作 0,则查询将为: 0 1 2 但是您正在存储索引 0 中的二进制数! 因此,您的代码将对第二个和第三个查询执行该操作。因此,您需要做的是从 i 和 j 的值中减去 1。

相关内容

  • 没有找到相关文章

最新更新