◎ 이 포스트는 CodeJam 2019의 Round 1A에 대한 설명과 풀이입니다. 자세한 문제 설명은 공식 사이트를 참조하세요. 아래 풀이는 개인적으로 작성한 것으로 CodeJam 공식 Analysis의 내용과 일치하지 않을 수 있습니다.
중국인의 나머지 정리를 이용해 풀이할 수 있다. 총 7번의 Try가 가능하기 때문에 18 이하의 소수 7개 (2, 3, 5, 7, 11, 13, 17)로 매 Try마다 Blade의 수를 통일하면 각 Try에서 방정식을 얻을 수 있다. 여기서 문제는 2 * 3 * 5 * 7 * 11 * 13 * 17 = 510510으로 10^6보다 작다는 것이다. 이 때 2나 3은 제곱하더라도 다른 소수와 서로소이기 때문에 널찍하게 (5, 7, 9, 11, 13, 16, 17)로 Blade를 통일하면 충분히 범위를 커버할 수 있다.
import sys
def extended(a, b):
a, b = max(a, b), min(a, b)
r1, r2 = a, b
s1, s2 = 1, 0
t1, t2 = 0, 1
while r2 > 0:
q = r1 // r2
r1, r2 = r2, r1 - q * r2
s1, s2 = s2, s1 - q * s2
t1, t2 = t2, t1 - q * t2
return ((s1 + b) % b, (t1 + a) % a)
Primes = [5, 7, 9, 11, 13, 16, 17]
L = 5 * 7 * 9 * 11 * 13 * 16 * 17
T, N, M = input().split()
T, N, M = int(T), int(N), int(M)
for tt in range(1, T + 1):
Ret = 0
for prime in Primes:
print (" ".join([str(prime)] * 18))
sys.stdout.flush()
response = sum([int(x) for x in input().split()]) % prime
# x = response (mod prime)
X = (L / prime) % prime
a, b = extended(prime, X)
Ret += (L / prime) * b * response
print (str(int(Ret + L) % L)) 최대 50개의 길이를 가지는 1000개의 단어에 대해서 추출가능한 접미사는 총 50000개다. 이 접미사를 최대로 매칭할 수 있는 경우를 찾으면 된다. 가장 간단한 방법은 일치하는 가장 긴 것부터 매치하는 방법이다. ZABCDE, BABCDE, ZCDE, CCDE의 단어가 있다고 하자. (ZABCDE, ZCDE)와 (BABCDE, CCDE)로 쌍을 지으면 CDE가 공통 접미사가 되기 때문에 한 쌍 밖에 만들 수 없다. (ZABCDE, BABCDE)와 (ZCDE, CCDE)로 쌍을 지으면 ABCDE와 CDE가 공통 접미사가 되기 때문에 두 쌍을 만들 수 있다.
즉, 긴 접미사부터 우선적으로 매칭을 시도하면 짧은 접미사에게 영향을 주지 않기 때문에 최대 매칭을 구할 수 있다.
T = int(input())
for tt in range(1, T + 1):
N = int(input())
Words = []
for i in range(N):
Words.append(input())
Suffixs = {}
Dic = {}
for i in range(N):
for j in range(0, len(Words[i])):
length = len(Words[i]) - j
if length not in Suffixs:
Suffixs[length] = []
if Words[i][j:] not in Dic:
Dic[Words[i][j:]] = []
Suffixs[length].append(Words[i][j:])
Dic[Words[i][j:]].append(i)
Used = {}
Ret = 0
keys = list(Suffixs.keys())
keys.sort(), keys.reverse()
for key_ in keys:
for word in Suffixs[key_]:
# check suffix is already used
if word in Used:
continue
# Filter out already used words
for i in range(len(Dic[word]) - 1, -1, -1):
if Dic[word][i] in Used:
del Dic[word][i]
# If pair can't be made, continue
if len(Dic[word]) < 2:
continue
# Mark used index and word.
Used[Dic[word][0]], Used[Dic[word][1]], Used[word] = True, True, True
Ret += 2
print("Case #" + str(tt) + ": " + str(Ret)) 23일에 미리 쓰는 일기다. 클라이밍 클라이밍을 제대로 배워보고 싶어 더클라임의 6주 과정을 신청해서, 매주 화목요일에…
AI AI Agent들이 어느 정도 유용한 건 맞지만, 생각보다 성능이 그렇게 시원찮은지는 모르겠다. 특히나 코드…
금주 금주를 시작해보기로 했다. 이미 술을 먹기로 하고 잡은 2개의 회식들은 예외로 하고, 나머지 자리에서는…
티앤미미 예약이 그렇게 힘들다는 티앤미미를 처남네가 운좋게 예약해서 어제 저녁 다녀왔다. 딤섬이 그렇게 맛있다고 하는데,…
This website uses cookies.