1
2
3
4
5
6
7
8
9
10 package main
11
12 import (
13 "time"
14 )
15
16 type BS struct {
17 length uint
18 s []uint64
19 }
20
21 const wSize = uint(64)
22 const lWSize = uint(6)
23
24 func D(i uint) int {
25 return int((i + (wSize - 1)) >> lWSize)
26 }
27
28 func N(length uint) (bs *BS) {
29 bs = &BS{
30 length,
31 make([]uint64, D(length)),
32 }
33
34 return bs
35 }
36
37 func (b *BS) S(i uint) *BS {
38 b.s[i>>lWSize] |= 1 << (i & (wSize - 1))
39 return b
40 }
41
42 var jn = [...]byte{
43 0, 1, 56, 2, 57, 49, 28, 3, 61, 58, 42, 50, 38, 29, 17, 4,
44 62, 47, 59, 36, 45, 43, 51, 22, 53, 39, 33, 30, 24, 18, 12, 5,
45 63, 55, 48, 27, 60, 41, 37, 16, 46, 35, 44, 21, 52, 32, 23, 11,
46 54, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6,
47 }
48
49 func T(v uint64) uint {
50 return uint(jn[((v&-v)*0x03f79d71b4ca8b09)>>58])
51 }
52
53 func (b *BS) NS(i uint) (uint, bool) {
54 x := int(i >> lWSize)
55 if x >= len(b.s) {
56 return 0, false
57 }
58 w := b.s[x]
59 w = w >> (i & (wSize - 1))
60 if w != 0 {
61 return i + T(w), true
62 }
63 x = x + 1
64 for x < len(b.s) {
65 if b.s[x] != 0 {
66 return uint(x)*wSize + T(b.s[x]), true
67 }
68 x = x + 1
69
70 }
71 return 0, false
72 }
73
74 func A() {
75 s := N(100000)
76 for i := 0; i < 1000; i += 30 {
77 s.S(uint(i))
78 }
79 for j := 0; j < 1000; j++ {
80 c := uint(0)
81 for i, e := s.NS(0); e; i, e = s.NS(i + 1) {
82 c++
83 }
84 }
85 }
86
87 func main() {
88 time.Sleep(time.Second)
89 A()
90 }
91
View as plain text