結果
問題 | No.1646 Avoid Palindrome |
ユーザー |
👑 |
提出日時 | 2021-08-13 22:12:53 |
言語 | Lua (LuaJit 2.1.1734355927) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,296 bytes |
コンパイル時間 | 272 ms |
コンパイル使用メモリ | 7,076 KB |
実行使用メモリ | 13,632 KB |
最終ジャッジ日時 | 2024-10-03 19:31:54 |
合計ジャッジ時間 | 32,110 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 10 TLE * 1 -- * 29 |
ソースコード
local mfl, mce = math.floor, math.ceillocal mod = 998244353local function bmul(x, y)local x0, y0 = x % 31596, y % 31596local x1, y1 = mfl(x / 31596), mfl(y / 31596)return (x1 * y1 * 62863 + (x1 * y0 + x0 * y1) * 31596 + x0 * y0) % modendlocal function badd(x, y) return (x + y) % mod endlocal n = io.read("*n", "*l")local s = io.read()local t = {}for i = 1, n dot[i] = s:sub(i, i)endfor i = 1, n - 1 doif t[i] == t[i + 1] and t[i] ~= "?" thenprint(0) os.exit()endendfor i = 1, n - 2 doif t[i] == t[i + 2] and t[i] ~= "?" thenprint(0) os.exit()endendif n == 1 thenprint(t[1] == "?" and 26 or 1) os.exit()endlocal dp1, dp2 = {}, {}if t[1] == "?" and t[2] == "?" thenfor i = 1, 26 do for j = 1, 26 dolocal v = (i - 1) * 26 + jdp1[v] = i == j and 0 or 1end endelseif t[1] == "?" thenlocal i2 = t[2]:byte() - 96for i = 1, 26 do for j = 1, 26 dolocal v = (i - 1) * 26 + jif i == i2 or j ~= i2 thendp1[v] = 0elsedp1[v] = 1endend endelseif t[2] == "?" thenlocal i1 = t[1]:byte() - 96for i = 1, 26 do for j = 1, 26 dolocal v = (i - 1) * 26 + jif i ~= i1 or j == i1 thendp1[v] = 0elsedp1[v] = 1endend endelselocal i1 = t[1]:byte() - 96local i2 = t[2]:byte() - 96for i = 1, 26 do for j = 1, 26 dolocal v = (i - 1) * 26 + jif i ~= i1 or j ~= i2 thendp1[v] = 0elsedp1[v] = 1endend endendfor i = 3, n dolocal src = i % 2 == 1 and dp1 or dp2local dst = i % 2 == 1 and dp2 or dp1for j = 1, 676 do dst[j] = 0 endfor prv_state = 1, 676 dolocal srcval = src[prv_state]local prvprv = mce(prv_state / 26)local prv = prv_state - (prvprv - 1) * 26if t[i] == "?" thenfor j = 1, 26 doif j ~= prvprv and j ~= prv thenlocal d = (prv - 1) * 26 + jdst[d] = badd(dst[d], srcval)endendelselocal z = t[i]:byte() - 96for j = 1, 26 doif j == z and j ~= prvprv and j ~= prv thenlocal d = (prv - 1) * 26 + jdst[d] = badd(dst[d], srcval)endendendendendlocal tbl = n % 2 == 1 and dp2 or dp1local ret = 0for i = 1, 676 doret = badd(ret, tbl[i])endprint(ret)