#include <bits/stdc++.h>
using namespace std;
using VI = vector<int>;
void Zpal(const char *s, int len, int *z) {
  z[0] = 0;
  for (int b = 0, i = 1; i < len; i++) {
    if (z[b] + b >= i)
      z[i] = min(z[2 * b - i], b + z[b] - i);
    else
      z[i] = 0;
    while (i + z[i] + 1 < len && i - z[i] - 1 >= 0 &&
           s[i + z[i] + 1] == s[i - z[i] - 1])
      z[i]++;
    if (z[i] + i > z[b] + b) b = i;
  }
}
const int N = 1e6 + 10;
int ans[N];
char s[N], t[N << 2];
int z[N << 2];
VI vec[N << 1];
int main() {
  int n, m;
  cin >> n;
  scanf("%s", s);
  for (int i = m = 0; i < n; i++) {
    t[m++] = s[i];
    t[m++] = '*';
    t[m++] = s[n - 1 - i];
    t[m++] = '*';
  }
  t[--m] = 0;
  Zpal(t, m, z);
  int mid = 2 * n - 1;
  multiset<int> st;
  for (int i = 2 * n - 2; i >= 0; i--) {
    if (i & 1) {
      if (i % 4 == 1) {
        st.insert(i);
        vec[i - z[i]].push_back(i);
      }
    } else {
      if (i % 4 == 0) {
        if (st.empty())
          ans[i / 4] = -1;
        else {
          int j = *--st.end();
          ans[i / 4] = (j - i + 1) / 2;
        }
      }
    }
    for (auto r : vec[i]) {
      st.erase(st.find(r));
    }
  }
  for (int i = 0; i < (n + 1 >> 1); i++) {
    printf("%d%c", ans[i], i + 1 < (n + 1 >> 1) ? ' ' : '\n');
  }
  return 0;
}
