为什么两份代码一个思路一个wa一个ac?

求教,两份代码思路是一样的,一个直接计数另一份用数组存数,结果一个wa一个ac?明明都是一样的呀
题目链接:cf

#pragma GCC optimize("O3")
#pragma GCC optimize(2)
#pragma GCC optimize("Ofast")
#include<iostream>
#include<cstring>
#define For(i,j,k) for(register int i=(j);i<(k);i++)
#define MEM(a,b) memset(a,b,sizeof(a))
#define endl "\n"

using namespace std;

typedef long long ll;

const int maxn=50;
int a[maxn];

int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n,t,x;
    cin >> t;
    while (t--) {
        cin >> n;
        ll cnt = 0;
        For(i, 0, n) {
            cin >> x;
            //if (x % 2 != i % 2)cnt++;//等价于(x^i)&1获取最高位数,1则奇偶性不同,否则相同,但是这段我用%2的wa,用&1的还是wa,服了
            if ((x ^ i) & 1)cnt++;
        }
        if (cnt & 1)cout << "-1" << endl;//思路:获取奇偶性不同的数的个数,奇数个则输出-1,否则输出总个数的1/2
        else cout << cnt / 2 << endl;
    }
    return 0;
}
//上面那份过不了,但是这份可以,难道一定得用数组?还是到底哪里出了问题? 46ms
/*int main()
{
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int n,t,x;
    cin >> t;
    while (t--) {
        cin >> n;
        MEM(a, 0);
        For(i, 0, n) {
            cin >> x;
            if ((x^i)&1)a[i&1]++;
        }
        if (a[0]==a[1])cout << a[0] << endl;
        else cout << "-1" << endl;
    }
    return 0;
}
*/

if ((x ^ i) & 1)cnt++;

if ((x^i)&1)a[i&1]++;

这两行并不等价