Problem:
Score : 800 points

Problem Statement

The beauty of a sequence a of length n is defined as a_1 \oplus \cdots \oplus a_n, where \oplus denotes the bitwise exclusive or (XOR).

You are given a sequence A of length N.
Snuke will insert zero or more partitions in A to divide it into some number of non-empty contiguous subsequences.

There are 2^{N-1} possible ways to insert partitions.
How many of them divide A into sequences whose beauties are all equal? Find this count modulo 10^{9}+7.

Constraints

All values in input are integers.

1 \leq N \leq 5 \times 10^5

0 \leq A_i < 2^{20}

Input

Input is given from Standard Input in the following format:

N
A_1 A_2 \ldots A_{N}

Output

Print the answer.

Sample Input 1

3
1 2 3

Sample Output 1

3

Four ways of dividing A shown below satisfy the condition. The condition is not satisfied only if A is divided into (1),(2),(3).

(1,2,3)

(1),(2,3)

(1,2),(3)

Sample Input 2

3
1 2 2

Sample Output 2

1

Sample Input 3

32
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Sample Output 3

147483634

Find the count modulo 10^{9}+7.

Sample Input 4

24
1 2 5 3 3 6 1 1 8 8 0 3 3 4 6 6 4 0 7 2 5 4 6 2

Sample Output 4

292

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> p_ll;

template<class T>
void debug(T itr1, T itr2) { auto now = itr1; while(now<itr2) { cout << *now << " "; now++; } cout << endl; }
#define repr(i,from,to) for (int i=(int)from; i<(int)to; i++)
#define all(vec) vec.begin(), vec.end()
#define rep(i,N) repr(i,0,N)
#define per(i,N) for (int i=(int)N-1; i>=0; i--)

const ll MOD = pow(10,9)+7;
const ll LLINF = pow(2,61)-1;
const int INF = pow(2,30)-1;

vector<ll> fac;
void c_fac(int x=pow(10,6)+10) { fac.resize(x,true); rep(i,x) fac[i] = i ? (fac[i-1]*i)%MOD : 1; }
ll inv(ll a, ll m=MOD) { ll b = m, x = 1, y = 0; while (b!=0) { int d = a/b; a -= b*d; swap(a,b); x -= y*d; swap(x,y); } return (x+m)%m; }
ll nck(ll n, ll k) { return fac[n]*inv(fac[k]*fac[n-k]%MOD)%MOD; }
ll gcd(ll a, ll b) { if (a<b) swap(a,b); return b==0 ? a : gcd(b, a%b); }
ll lcm(ll a, ll b) { return a/gcd(a,b)*b; }

// ----------------------------------------------------------------------
// ----------------------------------------------------------------------

vector<ll> zaatsu(vector<ll> &list) {
  map<ll, ll> num; for (auto x: list) num[x]++;
  ll p = num.begin()->first==0 ? 0 : 1; for (auto x: num) { num[x.first] = p; p++; }
  vector<ll> result; for (auto x: list) result.push_back(num[x]);
  return result;
}

// ----------------------------------------------------------------------
// ----------------------------------------------------------------------

int main() {
  int N; cin >> N;
  vector<ll> A(N); rep(i,N) cin >> A[i]; repr(i,1,N) A[i] ^= A[i-1];
  vector<ll> za = zaatsu(A);
  if (*min_element(all(za))!=0) { cout << 1 << endl; return 0; }
  ll ma = *max_element(all(za)) + 1;
  vector<ll> pos[ma]; rep(i,N) pos[za[i]].push_back(i);
  // debug(all(za));

  // rep(i,ma) debug(all(pos[i]));
  ll p0s = pos[0].size();
  ll result = 0;
  if (za[N-1]==0) {
    repr(i,1,ma) {
      vector<ll> now = {}; now.push_back(1);
      ll nz = 0, count = 0;
      for (auto x: pos[i]) {
        ll np = upper_bound(all(pos[0]),x) - pos[0].begin();
        if (nz!=np) {
          now.push_back(count); count = 1;
          now.push_back(np-nz); nz = np;
        }
        else count++;
      }
      if (nz!=p0s) {
        now.push_back(count);
        now.push_back(p0s-nz);
      }
      // debug(all(now));
      ll cp = 0, cz = 1;
      rep(i,now.size()) {
        if (i%2==0) cz = cz+(cp*now[i])%MOD;
        else cp = (cp+cz*now[i])%MOD;
      }
      result = (result+cp)%MOD;
    }
    ll p2 = 1, np = 1, num = 2;
    while ((p0s-1)>=np) {
      if ((p0s-1)&np) p2 = (p2*num)%MOD;
      np *= 2; num = (num*num)%MOD;
    }
    result = (result+p2)%MOD;
  }
  else {
    vector<ll> now = {}; now.push_back(1);
    ll nz = 0, count = 0;
    for (auto x: pos[za[N-1]]) {
      ll np = upper_bound(all(pos[0]),x) - pos[0].begin();
      if (nz!=np) {
        now.push_back(count); count = 1;
        now.push_back(np-nz); nz = np;
      }
      else count++;
    }
    // debug(all(now));
    ll cp = 0, cz = 1;
    rep(i,now.size()) {
      if (i%2==0) cz = (cz+cp*now[i])%MOD;
      else cp = (cp+cz*now[i]);
    }
    result += cz;
  }
  cout << result << endl;
  return 0;
}