"Gwarantujemy, że wszystkie wymagane do rozwiązania definicje makr wystąpią na wejściu."
To, jak się okazuje, oznacza, iż przypadek swierga:
2
A = B C
C = unlocked
A
może i pojawia się w testach, a "rozwija" się do poniższego stringa:
B unlocked
gdyż B nie zostało zdefiniowane. Głupio, że niesprecyzowane.
Czyli 'makra', a ściślej mówiąc identyfikatory pisane wielkimi literami, są traktowane albo jako literały stringów, albo jako makra, które trzeba rozwinąć (do większej ilości makr, bądź również do literałów).
A co do linii kodu - w wersji z jawnym stosem (std::stack), nazwanej uprzednio wersją iteracyjną, te 54 linie to liczyła sama funkcja rozwiązująca - jak dorzucić resztę kodu, to mam ich 123 (bo wczytywanie, deklaracje, funkcja pomocnicza, i nagłówki trochę zabierają). Natomiast wersja rekurencyjna jest identyczna poza samą funkcją rozwiązującą, która to została ponaddwukrotnie zmniejszona. Mały hint, jak rekurencyjnie efektywnie zrobić - memoizacja.