#include using namespace std; // 汎用 DP 関数 template vector accum_dp( const vector& xs, function>(int, T, X)> f, function op, T e, int size, const vector>& init, bool is_reset = true ) { vector dp(size, e); for (auto [i, v] : init) dp[i] = v; for (auto x : xs) { vector pp = is_reset ? vector(size, e) : dp; // dp.copy() の代わり swap(dp, pp); for (int i = 0; i < size; i++) { for (auto [p, v] : f(i, pp[i], x)) { if (p < 0 || p >= size) continue; dp[p] = op(dp[p], v); } } } return dp; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector A(N); for (int i = 0; i < N; i++) cin >> A[i]; // f: 遷移関数 auto next_func = [](int i, bool v, int x) -> vector> { if (!v) return {}; return {{i ^ x, true}}; }; // op: 集約演算 auto op = [](bool a, bool b) -> bool { return a || b; }; int size = 1 << 15; vector> init = {{0, true}}; auto dp = accum_dp(A, next_func, op, false, size, init, false); int ans = count(dp.begin(), dp.end(), true); cout << ans << "\n"; return 0; }