結果
問題 | No.517 壊れたアクセサリー |
ユーザー | shotoyoo |
提出日時 | 2021-08-09 18:31:15 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 43 ms / 2,000 ms |
コード長 | 1,774 bytes |
コンパイル時間 | 171 ms |
コンパイル使用メモリ | 81,888 KB |
実行使用メモリ | 55,512 KB |
最終ジャッジ日時 | 2024-09-21 17:30:22 |
合計ジャッジ時間 | 1,640 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 40 ms
54,392 KB |
testcase_01 | AC | 41 ms
54,204 KB |
testcase_02 | AC | 41 ms
54,312 KB |
testcase_03 | AC | 38 ms
54,528 KB |
testcase_04 | AC | 42 ms
55,296 KB |
testcase_05 | AC | 38 ms
54,008 KB |
testcase_06 | AC | 38 ms
54,848 KB |
testcase_07 | AC | 39 ms
54,392 KB |
testcase_08 | AC | 38 ms
54,868 KB |
testcase_09 | AC | 39 ms
54,644 KB |
testcase_10 | AC | 39 ms
54,180 KB |
testcase_11 | AC | 39 ms
55,184 KB |
testcase_12 | AC | 41 ms
54,484 KB |
testcase_13 | AC | 40 ms
54,860 KB |
testcase_14 | AC | 40 ms
54,584 KB |
testcase_15 | AC | 38 ms
55,296 KB |
testcase_16 | AC | 40 ms
55,312 KB |
testcase_17 | AC | 42 ms
55,512 KB |
testcase_18 | AC | 43 ms
54,448 KB |
ソースコード
import sys input = lambda : sys.stdin.readline().rstrip() sys.setrecursionlimit(2*10**5+10) write = lambda x: sys.stdout.write(x+"\n") debug = lambda x: sys.stderr.write(x+"\n") writef = lambda x: print("{:.12f}".format(x)) n = int(input()) a = [input() for _ in range(n)] m = int(input()) b = [input() for _ in range(m)] ns = [[] for _ in range(26)] rns = [[] for _ in range(26)] ds = [0]*26 seen = [0]*26 for s in a+b: for i in range(len(s)): ci = ord(s[i]) - ord("A") seen[ci] = 1 for j in range(i): cj = ord(s[j]) - ord("A") ns[cj].append(ci) rns[ci].append(cj) ds[cj] += 1 seen[ci] = seen[cj] = 1 def cycle(rns, ds): """出次数0の頂点を削除しつづける DAGならTPS順序も求まる rns: 逆辺の隣接リスト ds: もとのグラフにおける出次数 返り値 vs: 除かれた頂点 done: 除いたフラグ """ from collections import deque q = deque() n = len(rns) done = [False] * n ok = 1 for u in range(n): if ds[u]==0: if not seen[u]: done[u] = True continue q.append(u) done[u] = True vs = [] while q: # print([chr(ord("A")+v) for v in q]) if len(q)>=2: ok = 0 u = q.popleft() vs.append(u) for v in rns[u]: if done[v]: continue ds[v] -= 1 if ds[v]==0: done[v] = True q.append(v) return vs,done,ok vs,done,ok = cycle(rns,ds) if all(done): if ok: ans = "".join(map(chr, ((ord("A")+v) for v in vs)))[::-1] else: ans = -1 else: ans = -1 print(ans)