#include <bits/stdc++.h>
using namespace std;
int wa[100010], wb[100010], wv[100010], wss[100010];
int cmp(int *r, int a, int b, int len) {
  return r[a] == r[b] && r[a + len] == r[b + len];
}
void da(int *r, int *sa, int n, int m) {
  int i, j, p, *x = wa, *y = wb, *t;
  for (i = 0; i < m; i++) wss[i] = 0;
  for (i = 0; i < n; i++) wss[x[i] = r[i]]++;
  for (i = 1; i < m; i++) wss[i] += wss[i - 1];
  for (i = n - 1; i >= 0; i--) sa[--wss[x[i]]] = i;
  for (j = p = 1; p < n; j *= 2, m = p) {
    for (p = 0, i = n - j; i < n; i++) y[p++] = i;
    for (i = 0; i < n; i++)
      if (sa[i] >= j) y[p++] = sa[i] - j;
    for (i = 0; i < n; i++) wv[i] = x[y[i]];
    for (i = 0; i < m; i++) wss[i] = 0;
    for (i = 0; i < n; i++) wss[wv[i]]++;
    for (i = 1; i < m; i++) wss[i] += wss[i - 1];
    for (i = n - 1; i >= 0; i--) sa[--wss[wv[i]]] = y[i];
    for (t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; i++)
      x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++;
  }
}
int rak[100010], height[100010];
void calheight(int *r, int *sa, int n) {
  int i, j, k = 0;
  for (i = 0; i < n; i++) rak[sa[i]] = i;
  for (i = 0; i < n; height[rak[i++]] = k)
    for (k ? k-- : 0, j = sa[rak[i] - 1]; r[i + k] == r[j + k]; k++)
      ;
}
int r[100010], sa[100010], a[100010];
set<int> Set[100010];
map<int, int> Map;
int f[100010][20], bit[100010];
void rmq_init(int n) {
  int i, j, k;
  for (i = 1; i <= n; i++) f[i][0] = height[i];
  for (i = 1; (1 << i) <= n; i++) {
    for (j = 1; j <= n; j++) {
      k = j + (1 << (i - 1));
      if (k <= n)
        f[j][i] = min(f[j][i - 1], f[k][i - 1]);
      else
        f[j][i] = f[j][i - 1];
    }
  }
  bit[1] = 0;
  for (i = 1; (1 << i) < 100010; i++)
    for (j = (1 << i); j < (1 << (i + 1)) && j < 100010; j++)
      bit[j] = bit[1 << (i - 1)] + 1;
}
int rmq_min(int left, int right) {
  int m = bit[right - left + 1];
  return min(f[left][m], f[right - (1 << m) + 1][m]);
}
int query(int left, int right) {
  if (left > right) swap(left, right);
  return rmq_min(left + 1, right);
}
struct point {
  int x, y;
  point() {}
  point(int x, int y) : x(x), y(y) {}
  friend bool operator<(const point &p, const point &q) {
    if (p.y - p.x != q.y - q.x) return p.y - p.x < q.y - q.x;
    return p.x < q.x;
  }
} pt[100010 * 10];
int main() {
  int n, cnt = 0;
  memset(r, 0, sizeof(r));
  memset(sa, 0, sizeof(sa));
  memset(height, 0, sizeof(height));
  memset(rak, 0, sizeof(rak));
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    if (Map.find(a[i]) == Map.end()) Map[a[i]] = ++cnt;
    r[i] = Map[a[i]];
    Set[r[i]].insert(i);
  }
  int len = n + 1;
  da(r, sa, len, 100010);
  calheight(r, sa, len);
  rmq_init(len);
  int m = 0;
  for (int i = 1; i <= cnt; i++) {
    if (Set[i].size() >= 2) {
      for (set<int>::iterator it = Set[i].begin(); it != Set[i].end(); it++) {
        set<int>::iterator iter = it;
        iter++;
        if (iter == Set[i].end()) break;
        if (query(rak[*it], rak[*iter]) >= (*iter) - (*it))
          pt[++m] = point(*it, *iter);
      }
    }
  }
  int now = 0;
  sort(pt + 1, pt + m + 1);
  for (int i = 1; i <= m; i++)
    if (pt[i].x >= now) now = pt[i].y;
  printf("%d\n", n - now);
  for (int i = now; i < n; i++) {
    printf("%d", a[i]);
    if (i == n - 1)
      printf("\n");
    else
      printf(" ");
  }
  return 0;
}
