繁体   English   中英

为什么我的代码中出现“运行时错误-SIGSEGV”?

[英]Why am I getting a 'Runtime Error - SIGSEGV' in my code?

我有一些不可能的疑问要问您! (或者是??))

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

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

  • 0 :在B i和B j之间执行逻辑与运算,并在结果中输出1 s的数量。
  • 1 :在B i和B j之间执行逻辑或运算,并在结果中输出1 s的数量。
  • 2 :在B i和B j之间执行逻辑XOR运算,并在结果中输出1 s的数量。
  • 3 :翻转的值j B I的位(即,位设置为0 ,如果它等于1 ,反之亦然)。

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

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


输入格式:

第一行包含整数nm
接下来的n行包含长度为m二进制数。
i 行包含二进制数B I。
下一行包含一个整数q
接下来的q行包含类型为aij

输出格式:

的输出编号1中类型的结果S 012的查询。

约束:
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 again\n";
    }
}

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

另外,切勿自己#include <bits/stdc++.h> 这是一个非标准/非便携式头文件,包含文件远远超出了您的需求,而且往往不是您所需要的全部。 相反,仅包含您实际需要的标题。

同样, using namespace std; 认为是不良做法

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM