@@ -114,13 +114,248 @@ tags:
114
114
#### Java
115
115
116
116
``` java
117
-
117
+ class Solution {
118
+ static class TrieNode {
119
+ int count = 0 ;
120
+ int depth = 0 ;
121
+ int [] children = new int [26 ];
122
+
123
+ TrieNode () {
124
+ for (int i = 0 ; i < 26 ; ++ i) children[i] = - 1 ;
125
+ }
126
+ }
127
+
128
+ static class SegmentTree {
129
+ int n;
130
+ int [] tree;
131
+ int [] globalCount;
132
+
133
+ SegmentTree (int n , int [] globalCount ) {
134
+ this . n = n;
135
+ this . globalCount = globalCount;
136
+ this . tree = new int [4 * (n + 1 )];
137
+ for (int i = 0 ; i < tree. length; i++ ) tree[i] = - 1 ;
138
+ build(1 , 1 , n);
139
+ }
140
+
141
+ void build (int idx , int l , int r ) {
142
+ if (l == r) {
143
+ tree[idx] = globalCount[l] > 0 ? l : - 1 ;
144
+ return ;
145
+ }
146
+ int mid = (l + r) / 2 ;
147
+ build(idx * 2 , l, mid);
148
+ build(idx * 2 + 1 , mid + 1 , r);
149
+ tree[idx] = Math . max(tree[idx * 2 ], tree[idx * 2 + 1 ]);
150
+ }
151
+
152
+ void update (int idx , int l , int r , int pos , int newVal ) {
153
+ if (l == r) {
154
+ tree[idx] = newVal > 0 ? l : - 1 ;
155
+ return ;
156
+ }
157
+ int mid = (l + r) / 2 ;
158
+ if (pos <= mid) {
159
+ update(idx * 2 , l, mid, pos, newVal);
160
+ } else {
161
+ update(idx * 2 + 1 , mid + 1 , r, pos, newVal);
162
+ }
163
+ tree[idx] = Math . max(tree[idx * 2 ], tree[idx * 2 + 1 ]);
164
+ }
165
+
166
+ int query () {
167
+ return tree[1 ];
168
+ }
169
+ }
170
+
171
+ public int [] longestCommonPrefix (String [] words , int k ) {
172
+ int n = words. length;
173
+ int [] ans = new int [n];
174
+ if (n - 1 < k) return ans;
175
+
176
+ ArrayList<TrieNode > trie = new ArrayList<> ();
177
+ trie. add(new TrieNode ());
178
+
179
+ for (String word : words) {
180
+ int cur = 0 ;
181
+ for (char c : word. toCharArray()) {
182
+ int idx = c - ' a' ;
183
+ if (trie. get(cur). children[idx] == - 1 ) {
184
+ trie. get(cur). children[idx] = trie. size();
185
+ TrieNode node = new TrieNode ();
186
+ node. depth = trie. get(cur). depth + 1 ;
187
+ trie. add(node);
188
+ }
189
+ cur = trie. get(cur). children[idx];
190
+ trie. get(cur). count++ ;
191
+ }
192
+ }
193
+
194
+ int maxDepth = 0 ;
195
+ for (int i = 1 ; i < trie. size(); ++ i) {
196
+ if (trie. get(i). count >= k) {
197
+ maxDepth = Math . max(maxDepth, trie. get(i). depth);
198
+ }
199
+ }
200
+
201
+ int [] globalCount = new int [maxDepth + 1 ];
202
+ for (int i = 1 ; i < trie. size(); ++ i) {
203
+ TrieNode node = trie. get(i);
204
+ if (node. count >= k && node. depth <= maxDepth) {
205
+ globalCount[node. depth]++ ;
206
+ }
207
+ }
208
+
209
+ List<List<Integer > > fragileList = new ArrayList<> ();
210
+ for (int i = 0 ; i < n; ++ i) {
211
+ fragileList. add(new ArrayList<> ());
212
+ }
213
+
214
+ for (int i = 0 ; i < n; ++ i) {
215
+ int cur = 0 ;
216
+ for (char c : words[i]. toCharArray()) {
217
+ int idx = c - ' a' ;
218
+ cur = trie. get(cur). children[idx];
219
+ if (trie. get(cur). count == k) {
220
+ fragileList. get(i). add(trie. get(cur). depth);
221
+ }
222
+ }
223
+ }
224
+
225
+ int segSize = maxDepth;
226
+ if (segSize >= 1 ) {
227
+ SegmentTree segTree = new SegmentTree (segSize, globalCount);
228
+ for (int i = 0 ; i < n; ++ i) {
229
+ if (n - 1 < k) {
230
+ ans[i] = 0 ;
231
+ } else {
232
+ for (int d : fragileList. get(i)) {
233
+ segTree. update(1 , 1 , segSize, d, globalCount[d] - 1 );
234
+ }
235
+ int res = segTree. query();
236
+ ans[i] = res == - 1 ? 0 : res;
237
+ for (int d : fragileList. get(i)) {
238
+ segTree. update(1 , 1 , segSize, d, globalCount[d]);
239
+ }
240
+ }
241
+ }
242
+ }
243
+
244
+ return ans;
245
+ }
246
+ }
118
247
```
119
248
120
249
#### C++
121
250
122
251
``` cpp
123
-
252
+ class Solution {
253
+ public:
254
+ struct TrieNode {
255
+ int count = 0;
256
+ int depth = 0;
257
+ int children[ 26] = {0};
258
+ };
259
+
260
+ class SegmentTree {
261
+ public:
262
+ int n;
263
+ vector<int> tree;
264
+ vector<int>& globalCount;
265
+ SegmentTree(int n, vector<int>& globalCount)
266
+ : n(n)
267
+ , globalCount(globalCount) {
268
+ tree.assign(4 * (n + 1), -1);
269
+ build(1, 1, n);
270
+ }
271
+ void build (int idx, int l, int r) {
272
+ if (l == r) {
273
+ tree[ idx] = globalCount[ l] > 0 ? l : -1;
274
+ return;
275
+ }
276
+ int mid = (l + r) / 2;
277
+ build(idx * 2, l, mid);
278
+ build(idx * 2 + 1, mid + 1, r);
279
+ tree[ idx] = max(tree[ idx * 2] , tree[ idx * 2 + 1] );
280
+ }
281
+ void update(int idx, int l, int r, int pos, int newVal) {
282
+ if (l == r) {
283
+ tree[ idx] = newVal > 0 ? l : -1;
284
+ return;
285
+ }
286
+ int mid = (l + r) / 2;
287
+ if (pos <= mid)
288
+ update(idx * 2, l, mid, pos, newVal);
289
+ else
290
+ update(idx * 2 + 1, mid + 1, r, pos, newVal);
291
+ tree[ idx] = max(tree[ idx * 2] , tree[ idx * 2 + 1] );
292
+ }
293
+ int query() {
294
+ return tree[ 1] ;
295
+ }
296
+ };
297
+
298
+ vector<int> longestCommonPrefix(vector<string>& words, int k) {
299
+ int n = words.size();
300
+ vector<int> ans(n, 0);
301
+ if (n - 1 < k) return ans;
302
+ vector<TrieNode> trie(1);
303
+ for (const string& word : words) {
304
+ int cur = 0;
305
+ for (char c : word) {
306
+ int idx = c - 'a';
307
+ if (trie[cur].children[idx] == 0) {
308
+ trie[cur].children[idx] = trie.size();
309
+ trie.push_back({0, trie[cur].depth + 1});
310
+ }
311
+ cur = trie[cur].children[idx];
312
+ trie[cur].count++;
313
+ }
314
+ }
315
+ int maxDepth = 0;
316
+ for (int i = 1; i < trie.size(); ++i) {
317
+ if (trie[i].count >= k) {
318
+ maxDepth = max(maxDepth, trie[i].depth);
319
+ }
320
+ }
321
+ vector<int> globalCount(maxDepth + 1, 0);
322
+ for (int i = 1; i < trie.size(); ++i) {
323
+ if (trie[i].count >= k && trie[i].depth <= maxDepth) {
324
+ globalCount[trie[i].depth]++;
325
+ }
326
+ }
327
+ vector<vector<int>> fragileList(n);
328
+ for (int i = 0; i < n; ++i) {
329
+ int cur = 0;
330
+ for (char c : words[i]) {
331
+ int idx = c - 'a';
332
+ cur = trie[cur].children[idx];
333
+ if (trie[cur].count == k) {
334
+ fragileList[i].push_back(trie[cur].depth);
335
+ }
336
+ }
337
+ }
338
+ int segSize = maxDepth;
339
+ if (segSize >= 1) {
340
+ SegmentTree segTree(segSize, globalCount);
341
+ for (int i = 0; i < n; ++i) {
342
+ if (n - 1 < k) {
343
+ ans[i] = 0;
344
+ } else {
345
+ for (int d : fragileList[i]) {
346
+ segTree.update(1, 1, segSize, d, globalCount[d] - 1);
347
+ }
348
+ int res = segTree.query();
349
+ ans[i] = res == -1 ? 0 : res;
350
+ for (int d : fragileList[i]) {
351
+ segTree.update(1, 1, segSize, d, globalCount[d]);
352
+ }
353
+ }
354
+ }
355
+ }
356
+ return ans;
357
+ }
358
+ };
124
359
```
125
360
126
361
#### Go
0 commit comments