/*
task: repeats
lang: c
*/

#include <stdio.h>

#define FILE_IN  "repeats.in"
#define FILE_OUT "repeats.out"

#define MAX 50000
#define XXX 100

  struct el
  {
    char c;
    int nuo, k, l;
  };
  
  struct el mas[MAX + 1];
  int kart[MAX][XXX];
  static int A, B, N;
    
  void read_data()
  {
    FILE * f = fopen(FILE_IN, "r");
    int i;
    fscanf(f, "%d\n", &N);
    for (i = 1; i <= N; i++)
    {
      fscanf(f, "%c\n", &mas[i].c);
      if (mas[i].c == 'a')
      {
        A++;
      } else
      {
        B++;
      }
      mas[i].nuo = 0;
      mas[i].k   = 0; 
    }
    fclose(f);
  }
  
  void write_data(int k, int l, int nuo)
  {
    FILE * f = fopen(FILE_OUT, "w");
    fprintf(f, "%d\n%d\n%d", k, l, nuo);
    fclose(f);
  }
  
  int equal(int a, int b, int l)
  {
    int eq = 1, i = 0;
    if (a < l - 1) return 0;
    while ((eq) && (i < l))
    {
      eq = eq && (mas[b - i].c == mas[a - i].c);
      i++;
    }
    if (eq) return 1;
    return 0;
  }
  
  int MAX_k = 0, MAX_l, MAX_nuo;
  
  int main()
  {
    int i, j, x;

    A = 0; B = 0;

    read_data();

    if (A && B)
    {
      for (j = 1; j <= XXX; j++)
        {
          if (j * MAX_k > N)  // early departure...
          {
            write_data(MAX_k, MAX_l, MAX_nuo);
            return 0;
          }
          
          kart[j][j] = 1;
          for (i = 2 * j; i <= N; i++)
          {  
            if (equal(i, i - j, j)) 
              {
                kart[i][j] = kart[i - j][j] + 1;
                if (kart[i][j] > MAX_k)
                {
                  MAX_k = kart[i][j];
                  MAX_l = j;
                  MAX_nuo = i - MAX_k * MAX_l + 1;
                }
              }
            else kart[i][j] = 1;
          }
        }
    }
    else // nera simb "a" arba simb "b"
    {
      write_data(N, 1, 1);
      return 0;
    }  
    
    write_data(MAX_k, MAX_l, MAX_nuo);
    
    return 0;
  }
  
