Пример #1
0
 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);
 }
Пример #2
0
 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);
 }
Пример #3
0
  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 + "'");
  }