fork(1) download
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. #define NMAX 4000
  5. #define NUMS 63
  6.  
  7. typedef unsigned long long unum;
  8.  
  9. const int nbits = sizeof(unum)*8;
  10.  
  11. unum
  12. scalar_product_mod2(unum *row, unum *col, int n)
  13. {
  14. unum res, bit, sum;
  15. sum = 0U;
  16. for(int i = 0; i < n; i++)
  17. sum ^= row[i] & col[i];
  18. res = 0U;
  19. for(; sum != 0; sum >>= 1)
  20. res ^= sum & 1;
  21. return res;
  22. }
  23.  
  24. int
  25. main(int argc, char *argv[])
  26. {
  27. int nums, n;
  28. unum bit, count;
  29. unum rows[NMAX][NUMS];
  30. unum cols[NMAX][NUMS];
  31. char buf[NMAX+2];
  32.  
  33. std::memset(rows, 0, NMAX*NUMS*sizeof(unum));
  34. std::memset(cols, 0, NMAX*NUMS*sizeof(unum));
  35. std::memset(buf, 0, NMAX+2);
  36. std::cin.sync_with_stdio(false);
  37. std::cin >> n;
  38. std::cin.getline(buf, 0);
  39.  
  40. for(int i = 0; i < n; i++) {
  41. std::cin.getline(buf, n+1);
  42. for(int j = 0; j < n; j++) {
  43. bit = buf[j] - '0';
  44. rows[i][j/nbits] |= bit << j%nbits;
  45. cols[j][i/nbits] |= bit << i%nbits;
  46. }
  47. }
  48.  
  49. count = 0;
  50. nums = n/nbits + 1;
  51. if(nums > NUMS)
  52. nums = NUMS;
  53. for(int i = 0; i < n; i++)
  54. for(int j = 0; j < n; j++)
  55. count += scalar_product_mod2(rows[i], cols[j], nums);
  56.  
  57. std::cout << count << std::endl;
  58.  
  59. return 0;
  60. }
Success #stdin #stdout 0s 7100KB
stdin
5
10010
11001
10100
11110
10100
stdout
12