Максимізується побітове AND по шляху, а особливість цієї операції в тому, що результат ніколи не «вмикає» біт, якого немає хоча б в одного числа шляху. Тому працює класична техніка — жадібне добирання відповіді від старшого біта.
Ітеруватимемо біти від найстаршого до нульового, підтримуючи поточну маску-кандидат (спочатку нуль). На кроці для біта спробуємо маску \mathrm{cand} = \mathrm{ans} \mathbin{|} 2^t і перевіримо, чи існує шлях, у якому всі клітинки містять усі біти цієї маски. Якщо існує — залишаємо \mathrm{ans} = \mathrm{cand}, інакше цей біт недосяжний і ми його не беремо.
Перевірка — проста динаміка на сітці. Клітинка вважається прохідною, якщо a_{i,j} \mathbin{\&} \mathrm{cand} = \mathrm{cand}. Тоді
з базою \mathrm{reach}[1][1] = \text{прохідна}(1,1). Шлях існує, якщо істинне.
Чому жадібність коректна? Старший біт «важить» більше, ніж усі молодші разом узяті, тому якщо його можна отримати — його треба брати, незалежно від того, що буде далі.
Складність — \mathcal{O}(B \cdot n \cdot m), де — кількість бітів у числах. Значення можуть бути великими, тому працюйте у 64-бітному типі й перебирайте біти аж до -го.