linwe
2024-08-09 8b7258c9427882bb1798f1502eaa35184c6e374e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package org.springblade.modules.words.internals;
 
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
 
public class TrieNodeEx {
    public Integer Char;
    public boolean End;
    public Integer Index;
    public List<Integer> Results;
    public Map<Integer, TrieNodeEx> m_values;
    private Integer minflag = Integer.MAX_VALUE;
    private Integer maxflag = 0;
    public int Next;
 
    public TrieNodeEx() {
        m_values = new Hashtable<Integer, TrieNodeEx>();
        Results = new ArrayList<Integer>();
    }
 
    public void Add(int c, TrieNodeEx node3) {
        if (minflag > c) {
            minflag = c;
        }
        if (maxflag < c) {
            maxflag = c;
        }
        m_values.put(c, node3);
    }
 
    public void SetResults(Integer text) {
        if (End == false) {
            End = true;
        }
        if (Results.contains(text) == false) {
            Results.add(text);
        }
    }
 
    public boolean HasKey(Integer c) {
        if (minflag <= c && maxflag >= c) {
            return m_values.containsKey((int) c);
        }
        return false;
    }
 
    public void Rank(Integer oneStart, Integer start, boolean[] seats, boolean[] seats2, Integer[] has) {
        if (maxflag == 0)
            return;
        if (minflag == maxflag) {
            RankOne(oneStart, seats, has);
            return;
        }
        List<Integer> keys = new ArrayList<Integer>();
        m_values.forEach((k, v) -> {
            keys.add((int) k);
        });
 
        Integer length = keys.size() - 1;
        int[] moves = new int[keys.size() - 1];
        for (int i = 1; i < keys.size(); i++) {
            moves[i - 1] = maxflag - keys.get(i);
        }
 
        while (has[start] != null) {
            start++;
        }
        Integer s = start < minflag ? minflag : start;
 
        for (int i = s; i < s + (maxflag - minflag); i++) {
            if (has[i] != null) {
                for (int j = 0; j < length; j++) {
                    Integer p = i + moves[j];
                    if (seats2[p] == false) {
                        seats2[p] = true;
                    }
                }
            }
        }
        Integer max = 0;
        for (int i = s + (maxflag - minflag); i < has.length; i++) {
            if (has[i] == null) {
                if (seats2[i]) {
                    continue;
                }
                Integer next = i - (Integer) maxflag;
                if (seats[next])
                    continue;
                SetSeats(next, seats, has);
                max = i;
                break;
            } else {
                for (int j = 0; j < length; j++) {
                    Integer p = i + moves[j];
                    if (seats2[p] == false) {
                        seats2[p] = true;
                    }
                }
            }
        }
        start += keys.size() / 2;
        for (int p = start; p < max + maxflag - start + 1; p++) {
            if (seats2[p] == true) {
                seats2[p] = false;
            }
        }
    }
 
    private void RankOne(Integer start, boolean[] seats, Integer[] has) {
        while (has[start] != null) {
            start++;
        }
        Integer s = start < minflag ? minflag : start;
 
        for (Integer i = s; i < has.length; i++) {
            if (has[i] == null) {
                Integer next = i - (Integer) minflag;
                if (seats[next])
                    continue;
                SetSeats(next, seats, has);
                break;
            }
        }
        start++;
    }
 
 
    private void SetSeats(Integer next, boolean[] seats, Integer[] has) {
        Next = next;
        seats[next] = true;
 
        m_values.forEach((key, value) -> {
            int position = next + key;
            has[position] = value.Index;
        });
    }
 
}