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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

//package TaskE;

import java.io.FileInputStream;
import java.util.*;

import static java.lang.Math.sqrt;

public class Main {
    long N;
    long[] A;
    long XOR = 0;
    static long M = (long)1e9 + 7;

    Map<Long,Long> mp = new HashMap<>();

    long mpow(long a, long n){
        if(n==0) return 1;
        long r = mpow(a, n/2);
        r = (r * r)%M;
        if(n%2==1) r = r * a;
        return r % M;
    }

    void solve() throws Exception {
        Scanner sc = new Scanner(System.in);
        N = sc.nextLong();
        A = new long[(int)N];
        long res = 0;
        for(int i=0; i<N; i++){
            A[i] = sc.nextLong();
            XOR = XOR ^ A[i];
            if(!mp.containsKey(XOR)){
                mp.put(XOR, 0L);
            }
            mp.put(XOR, mp.get(XOR)+1);
        }

        if(XOR == 0){
            for(long a : mp.keySet()){
                long n = mp.get(a);
                if(a!=0) res += mpow(2, n/2);
                else res += mpow(2, n-1);
                res %= M;
            }

        }else{
            long n = mp.get(XOR);
            res = mpow(2, n/2);

        }
        System.out.println(res);


    }

    public static void main(String[] args) throws Exception{
        //System.setIn(new FileInputStream("inputs/e.in"));
        Main s = new Main();
        s.solve();
    }
}