public static void main(String[] args) { Scanner sc = new Scanner(System.in); r = sc.nextInt(); cc = sc.nextInt(); sc.nextLine(); Fila[] entrada = new Fila[r]; for (int i = 0; i < r; i++) { if (!sc.hasNextLine()) { r = i; Fila[] entradaTemp = new Fila[r]; for (int j = 0; j < r; j++) entradaTemp[j] = entrada[j]; entrada = entradaTemp; break; } entrada[i] = new Fila(sc.nextLine().trim()); } char[] todos = new char[300 * 300 * 2 + 1000]; int posicionActual = 0; char indicadorActual = 300; for (Fila f : entrada) { f.esta.getChars(0, f.esta.length(), todos, posicionActual); for (int i = 0; i < f.esta.length(); i++) f.bID[i] = posicionActual + i; posicionActual += f.esta.length(); todos[posicionActual++] = indicadorActual++; StringBuilder sb = new StringBuilder(f.esta); sb.reverse(); sb.toString().getChars(0, f.esta.length(), todos, posicionActual); for (int i = 0; i < f.esta.length(); i++) f.bDI[i] = posicionActual + i; posicionActual += f.esta.length(); todos[posicionActual++] = indicadorActual++; } SuffixArray sa = new SuffixArray(new String(todos, 0, posicionActual)); int mejorActual = 0; for (int i = 0; i < r; i++) { for (int j = 0; j < cc; j++) { for (int k = mejorActual + 1; i + k < r && j + k < cc; k++) { boolean posible = true; int a = i + k; for (int l = i; l < a; l++) { int res = sa.lcp(sa.b[entrada[l].bID[j]], sa.b[entrada[a].bDI[cc - j - k - 1]]); if (res < k + 1) { posible = false; break; } a--; } if (posible) mejorActual = k; } } } System.out.println(mejorActual == 0 ? -1 : mejorActual + 1); }
public static void main(String[] args) { String text = StdIn.readAll(); int N = text.length(); SuffixArray sa = new SuffixArray(text); String lrs = ""; for (int i = 1; i < N; i++) { int length = sa.lcp(i); if (length > lrs.length()) { lrs = sa.select(i).substring(0, length); } } StdOut.println(lrs); }
public static void main(String[] args) { String text = StdIn.readAll().replaceAll("\\s+", " "); SuffixArray sa = new SuffixArray(text); int N = sa.length(); String lrs = ""; for (int i = 1; i < N; i++) { int length = sa.lcp(i); if (length > lrs.length()) { // lrs = sa.select(i).substring(0, length); lrs = text.substring(sa.index(i), sa.index(i) + length); } } StdOut.println("'" + lrs + "'"); }