結果
問題 | No.2210 equence Squence Seuence |
ユーザー | 👑 obakyan |
提出日時 | 2023-02-19 00:05:40 |
言語 | Lua (LuaJit 2.1.1696795921) |
結果 |
TLE
|
実行時間 | - |
コード長 | 9,675 bytes |
コンパイル時間 | 162 ms |
コンパイル使用メモリ | 5,376 KB |
実行使用メモリ | 32,768 KB |
最終ジャッジ日時 | 2024-07-20 06:20:16 |
合計ジャッジ時間 | 12,342 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 363 ms
9,856 KB |
testcase_04 | AC | 428 ms
9,856 KB |
testcase_05 | AC | 728 ms
17,024 KB |
testcase_06 | AC | 589 ms
10,240 KB |
testcase_07 | AC | 1,830 ms
25,464 KB |
testcase_08 | AC | 3 ms
5,376 KB |
testcase_09 | AC | 3 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | AC | 3 ms
5,376 KB |
testcase_13 | TLE | - |
testcase_14 | TLE | - |
testcase_15 | TLE | - |
testcase_16 | TLE | - |
testcase_17 | TLE | - |
testcase_18 | AC | 3 ms
6,944 KB |
testcase_19 | AC | 2 ms
6,948 KB |
testcase_20 | AC | 2 ms
6,944 KB |
testcase_21 | AC | 2 ms
6,940 KB |
testcase_22 | AC | 3 ms
6,944 KB |
testcase_23 | AC | 270 ms
25,448 KB |
testcase_24 | AC | 190 ms
14,568 KB |
testcase_25 | AC | 235 ms
25,064 KB |
testcase_26 | AC | 307 ms
25,700 KB |
testcase_27 | AC | 82 ms
8,596 KB |
ソースコード
local mfl, mce = math.floor, math.ceil local mmi, mma = math.min, math.max local bls, brs = bit.lshift, bit.rshift local SegTree = {} SegTree.updateAll = function(self) for i = self.stagenum - 1, 1, -1 do local cnt = bls(1, i - 1) for j = 1, cnt do self.stage[i][j] = self.func(self.stage[i + 1][j * 2 - 1], self.stage[i + 1][j * 2]) end end end SegTree.create = function(self, n, func, emptyvalue) self.func, self.emptyvalue = func, emptyvalue local stagenum, mul = 1, 1 self.stage = {{}} while mul < n do mul, stagenum = mul * 2, stagenum + 1 self.stage[stagenum] = {} end self.stagenum = stagenum self.left_stage = {} for i = 1, n do local sp, sz = 1, bls(1, stagenum - 1) while(i - 1) % sz ~= 0 do sp, sz = sp + 1, brs(sz, 1) end self.left_stage[i] = sp end self.sz_stage = {} local tmp, sp = 1, stagenum for i = 1, n do if tmp * 2 == i then tmp, sp = tmp * 2, sp - 1 end self.sz_stage[i] = sp end for i = 1, mul do self.stage[stagenum][i] = emptyvalue end self:updateAll() end SegTree.getRange = function(self, left, right) if left == right then return self.stage[self.stagenum][left] end local stagenum = self.stagenum local ret = self.emptyvalue while left <= right do local stage = mma(self.left_stage[left], self.sz_stage[right - left + 1]) local sz = bls(1, stagenum - stage) ret = self.func(ret, self.stage[stage][1 + brs(left - 1, stagenum - stage)]) left = left + sz end return ret end SegTree.update = function(self, idx) for i = self.stagenum - 1, 1, -1 do local dst = brs(idx + 1, 1) local rem = dst * 4 - 1 - idx self.stage[i][dst] = self.func(self.stage[i + 1][idx], self.stage[i + 1][rem]) idx = dst end end SegTree.setValue = function(self, idx, value, silent) self.stage[self.stagenum][idx] = value if not silent then self:update(idx) end end SegTree.new = function(n, func, emptyvalue) local obj = {} setmetatable(obj, {__index = SegTree}) obj:create(n, func, emptyvalue) return obj end local function SA_IS(data, data_size, word_size) local suffix_array = {} local type_tag = {} -- -2: L, -1: S, 1~: i-th LMS for i = 1, data_size do suffix_array[i] = -1 type_tag[i] = -2 end local word_count = {} local word_count_sum = {} local word_pushback_count = {} local word_pushfront_count = {} for i = 1, word_size do word_count[i] = 0 word_count_sum[i] = 0 word_pushback_count[i] = 0 word_pushfront_count[i] = 0 end local lms_count = 0 local lms_data_indexes = {} local sorted_lms_data_indexes = {} local lms_compressed_data = {} for i = 1, data_size do word_count[data[i]] = word_count[data[i]] + 1 end word_count_sum[1] = word_count[1] for i = 2, word_size do word_count_sum[i] = word_count_sum[i - 1] + word_count[i] end local prev_type = -2 for i = data_size - 1, 1, -1 do if data[i] == data[i + 1] then type_tag[i] = prev_type else type_tag[i] = data[i] < data[i + 1] and -1 or -2 prev_type = type_tag[i] end end for i = 2, data_size do if type_tag[i - 1] == -2 and type_tag[i] == -1 then lms_count = lms_count + 1 type_tag[i] = lms_count lms_data_indexes[lms_count] = i sorted_lms_data_indexes[lms_count] = -1 lms_compressed_data[lms_count] = -1 end end -- put LMS for i = 1, lms_count do local idx = lms_data_indexes[i] local w = data[idx] suffix_array[word_count_sum[w] - word_pushback_count[w]] = idx word_pushback_count[w] = word_pushback_count[w] + 1 end -- put L do local w = data[data_size] local offset = w == 1 and 0 or word_count_sum[w - 1] suffix_array[offset + 1] = data_size word_pushfront_count[w] = word_pushfront_count[w] + 1 end for sufa_idx = 1, data_size - 1 do local data_idx = suffix_array[sufa_idx] if 1 < data_idx then data_idx = data_idx - 1 if type_tag[data_idx] == -2 then local w = data[data_idx] local offset = w == 1 and 0 or word_count_sum[w - 1] word_pushfront_count[w] = word_pushfront_count[w] + 1 suffix_array[offset + word_pushfront_count[w]] = data_idx end end end -- remove LMS for w = 1, word_size do word_pushback_count[w] = 0 end -- put S for sufa_idx = data_size, 1, -1 do local data_idx = suffix_array[sufa_idx] if 1 < data_idx then data_idx = data_idx - 1 if -1 <= type_tag[data_idx] then local w = data[data_idx] suffix_array[word_count_sum[w] - word_pushback_count[w]] = data_idx word_pushback_count[w] = word_pushback_count[w] + 1 end end end local lms_data_value = 0 local prev_lms_index = 0 local prev_lms_data_index = 0 for sufa_idx = 1, data_size do local data_idx = suffix_array[sufa_idx] local lms_idx = type_tag[data_idx] if 1 <= lms_idx then local is_same = false if 0 < prev_lms_data_index and prev_lms_index ~= lms_count and lms_idx ~= lms_count then local len1 = lms_data_indexes[lms_idx + 1] - data_idx local len2 = lms_data_indexes[prev_lms_index + 1] - prev_lms_data_index if len1 == len2 then is_same = true for i = 0, len1 do if data[i + data_idx] ~= data[i + prev_lms_data_index] then is_same = false break end end end end if not is_same then lms_data_value = lms_data_value + 1 end lms_compressed_data[lms_idx] = lms_data_value prev_lms_index = lms_idx prev_lms_data_index = data_idx end end if lms_data_value == lms_count then for i = 1, lms_count do sorted_lms_data_indexes[lms_compressed_data[i]] = lms_data_indexes[i] end else local lms_sa = SA_IS(lms_compressed_data, lms_count, lms_data_value) for i = 1, lms_count do sorted_lms_data_indexes[i] = lms_data_indexes[lms_sa[i]] end end for i = 1, lms_count do local inv = lms_count + 1 - i if inv <= i then break end sorted_lms_data_indexes[i], sorted_lms_data_indexes[inv] = sorted_lms_data_indexes[inv], sorted_lms_data_indexes[i] end -- Second Induced Sort for i = 1, data_size do suffix_array[i] = -1 end for i = 1, word_size do word_pushback_count[i] = 0 word_pushfront_count[i] = 0 end -- put LMS for i = 1, lms_count do local idx = sorted_lms_data_indexes[i] local w = data[idx] suffix_array[word_count_sum[w] - word_pushback_count[w]] = idx word_pushback_count[w] = word_pushback_count[w] + 1 end -- put L do local w = data[data_size] local offset = w == 1 and 0 or word_count_sum[w - 1] suffix_array[offset + 1] = data_size word_pushfront_count[w] = word_pushfront_count[w] + 1 end for sufa_idx = 1, data_size - 1 do local data_idx = suffix_array[sufa_idx] if 1 < data_idx then data_idx = data_idx - 1 if type_tag[data_idx] == -2 then local w = data[data_idx] local offset = w == 1 and 0 or word_count_sum[w - 1] word_pushfront_count[w] = word_pushfront_count[w] + 1 suffix_array[offset + word_pushfront_count[w]] = data_idx end end end -- remove LMS for w = 1, word_size do word_pushback_count[w] = 0 end -- put S for sufa_idx = data_size, 1, -1 do local data_idx = suffix_array[sufa_idx] if 1 < data_idx then data_idx = data_idx - 1 if -1 <= type_tag[data_idx] then local w = data[data_idx] suffix_array[word_count_sum[w] - word_pushback_count[w]] = data_idx word_pushback_count[w] = word_pushback_count[w] + 1 end end end return suffix_array end local SAIS = {} SAIS.create = function(self, data, data_size, word_size) local sufa = SA_IS(data, data_size, word_size) local sufa_inv = {} for i = 1, data_size do sufa_inv[i] = 0 end for i = 1, data_size do sufa_inv[sufa[i]] = i end self.sufa = sufa self.sufa_inv = sufa_inv -- LCPA local n = data_size local lcpa = {} for i = 1, n - 1 do lcpa[i] = 0 end local spos = 0 for i = 1, n do local lcppos = sufa_inv[i] if lcppos < n then local len = spos local p1, p2 = sufa[lcppos], sufa[lcppos + 1] p1, p2 = p1 + spos, p2 + spos while p1 <= n and p2 <= n do if data[p1] == data[p2] then len = len + 1 p1, p2 = p1 + 1, p2 + 1 else break end end lcpa[lcppos] = len spos = 1 < len and len - 1 or 0 end end self.lcpa = lcpa self.data = data self.n = n end local n, k = io.read("*n", "*n") local a = {} for i = 1, n do a[i] = io.read("*n") end SAIS:create(a, n, n) local sufa = SAIS.sufa local sufa_inv = SAIS.sufa_inv local lcpa = SAIS.lcpa local st = SegTree.new(n - 1, mmi, 1000000007) for i = 1, n - 1 do st:setValue(i, lcpa[i], true) end st:updateAll() local function getlen(x, y) if y < x then x, y = y, x end return st:getRange(x, y - 1) end local t = {} for i = 1, n do t[i] = i end -- 123456789 -- 23456789 -- 12 456789 -- 1234 6789 -- 12345678 local function compare(x, y) if x < y then local p1 = sufa_inv[x + 1] local p2 = sufa_inv[x] local len = getlen(p1, p2) if y - x <= len then return false else return p1 < p2 end else local p1 = sufa_inv[y + 1] local p2 = sufa_inv[y] local len = getlen(p1, p2) if x - y <= len then return false else return p2 < p1 end end end table.sort(t, compare) local b = {} for i = 1, n do if i ~= t[k] then table.insert(b, a[i]) end end print(table.concat(b, " "))