← Home
package main

import (
	"bufio"
	"fmt"
	"math/big"
	"math/bits"
	"os"
	"strconv"
)

type Bitset [32]uint64

func (b *Bitset) Xor(other *Bitset) {
	for i := 0; i < 32; i++ {
		b[i] ^= other[i]
	}
}

func (b *Bitset) SetBit(i int) {
	b[i/64] |= 1 << (i % 64)
}

func (b *Bitset) GetBit(i int) int {
	return int((b[i/64] >> (i % 64)) & 1)
}

func (b *Bitset) HighBit() int {
	for i := 31; i >= 0; i-- {
		if b[i] != 0 {
			return i*64 + 63 - bits.LeadingZeros64(b[i])
		}
	}
	return -1
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 1024*1024)

	if !scanner.Scan() {
		return
	}
	m, _ := strconv.Atoi(scanner.Text())

	var basisVal [2048]Bitset
	var basisRepr [2048]Bitset
	var hasBasis [2048]bool

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for i := 0; i < m; i++ {
		if !scanner.Scan() {
			break
		}
		s := scanner.Text()
		var x big.Int
		x.SetString(s, 10)

		var val Bitset
		for j := 0; j < x.BitLen(); j++ {
			if x.Bit(j) == 1 {
				val.SetBit(j)
			}
		}

		var repr Bitset
		repr.SetBit(i)

		for {
			hb := val.HighBit()
			if hb == -1 {
				break
			}
			if hasBasis[hb] {
				val.Xor(&basisVal[hb])
				repr.Xor(&basisRepr[hb])
			} else {
				hasBasis[hb] = true
				basisVal[hb] = val
				basisRepr[hb] = repr
				break
			}
		}

		if val.HighBit() == -1 {
			var indices []int
			for j := 0; j < i; j++ {
				if repr.GetBit(j) == 1 {
					indices = append(indices, j)
				}
			}
			fmt.Fprintf(out, "%d", len(indices))
			for _, idx := range indices {
				fmt.Fprintf(out, " %d", idx)
			}
			fmt.Fprintln(out)
		} else {
			fmt.Fprintln(out, "0")
		}
	}
}