import java.util.Scanner; public class TombHater_bobk { private final static int QCAP = 1000000, DSIZE = 18750000, SIZE = 50; private static int qCount; private static int qTail; private static int qHead; private static int k; private static int[] dist, queue; private static char[][] grid; private static String[] glyphs; private static void enqueue(int dir,int row,int col,int word,int pos) { if (qCount == QCAP) { System.err.println("Queue full"); return; } qCount++; queue[qTail] = pos + SIZE * (word + SIZE * (col + SIZE * (row + SIZE * dir))); qTail = (qTail + 1) % QCAP; } private static int dequeue() { qCount--; qHead = (qHead + 1) % QCAP; return queue[qHead]; } private static void check(int dir,int row,int col,int word,int pos,int cost) { char symbol = grid[row][col]; int idx = SIZE * (col + SIZE * (row + SIZE * dir)); if (pos == glyphs[word].length()) for (int i=0;i 0) { int cell = dequeue(); int cell2 = cell; int pos = cell % SIZE; cell /= SIZE; int word = cell % SIZE; cell /= SIZE; int col = cell % SIZE; cell /= SIZE; int row = cell % SIZE; int dir = cell / SIZE; if (dir != 2 && col > 0) check(0, row, col - 1, word, pos + 1, dist[cell2]); if (row < m - 1) check(1, row + 1, col, word, pos + 1, dist[cell2]); if (dir != 0 && col < n - 1) check(2, row, col + 1, word, pos + 1, dist[cell2]); } int best = 99999; for (int i=0;i