我有一些无法解决的问题供您查询! (或者是??))
您有n
个二进制数字,长度为m
。 i
th 二进制数是B i 。另外,您必须对它们执行q
个查询。索引从零开始,而位的索引从左开始。
查询的类型为:a
,i
,j
。
如果a
是:
0
:在B i 和B j 之间执行逻辑与运算,并在结果中输出1
个数。1
:在B i 和B j 之间执行逻辑或运算,并在结果中输出1
个数。2
:在B i 和B j 之间执行逻辑XOR操作,并在结果中输出1
个数。3
:翻转B i 的j
th 位的值(即,如果该位设置为0
等于1
,反之亦然)。 注意:对于类型为0
,1
和2
的查询,二进制数保持不变。
还建议对C ++和JAVA程序员使用快速I / O。
输入格式:
第一行包含整数n
和m
。
接下来的n
行包含长度为m
的二进制数。
第i
行包含二进制数字B i 。
下一行包含一个整数q
接下来的q
行包含类型为a
,i
,j
的查询。
输出格式:
根据类型1
,0
和1
的查询结果,输出2
的数量。
约束:
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;
}
答案 0 :(得分:2)
您在堆栈中分配的两个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;
是considered bad practice。
答案 1 :(得分:0)
好的,所以我认为您在这里有些复杂。 查询的大小为10 ^ 6,并且您将数组声明为query [3000] [3000]。 现在,我认为您不需要存储查询。考虑这个-
cin>>q;
while(q--)
{
cin>>a>>i>>j;
/*Your code here*/
}
该问题指出查询的形式为:a i j 因此,例如,如果您想对前两个字符串执行操作0,则查询将为: 0 1 2 但是您正在存储索引0中的二进制数! 因此,您的代码将对第二个和第三个查询执行操作。因此,您需要做的就是从i和j的值中减去1。