#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int SIZE = 1e6 + 10;
const double PI = acos(-1.0);
template <typename T>
struct TPoint2D {
  T X, Y;
  TPoint2D() : X(), Y() {}
  TPoint2D(const T& x, const T& y) : X(x), Y(y) {}
  TPoint2D(const TPoint2D<T>& p) : X(p.X), Y(p.Y) {}
  TPoint2D& operator=(const TPoint2D<T>& p) {
    X = p.X;
    Y = p.Y;
    return *this;
  }
  T operator&(const TPoint2D<T>& p) const { return X * p.X + Y * p.Y; }
  T operator^(const TPoint2D<T>& p) const { return X * p.Y - Y * p.X; }
  TPoint2D conj() const { return TPoint2D(X, -Y); }
  TPoint2D<T> operator*(const TPoint2D<T>& p) const {
    return TPoint2D<T>(*this & p.conj(), -*this ^ p.conj());
  }
  TPoint2D<T> operator*(const T& p) const { return TPoint2D<T>(p * X, p * Y); }
  TPoint2D<T> operator-(void) const { return TPoint2D(-X, -Y); }
  TPoint2D<T> operator+(const TPoint2D<T>& p) const {
    return TPoint2D(X + p.X, Y + p.Y);
  }
  TPoint2D<T> operator-(const TPoint2D<T>& p) const { return *this + (-p); }
  T norm() const { return X * X + Y * Y; }
};
void fft(vector<TPoint2D<double> >& a, bool invert) {
  int n = (int)a.size();
  for (int i = 1, j = 0; i < n; ++i) {
    int bit = n >> 1;
    for (; j >= bit; bit >>= 1) j -= bit;
    j += bit;
    if (i < j) swap(a[i], a[j]);
  }
  for (int len = 2; len <= n; len <<= 1) {
    double ang = 2 * PI / len * (invert ? -1 : 1);
    TPoint2D<double> wlen(cos(ang), sin(ang));
    for (int i = 0; i < n; i += len) {
      TPoint2D<double> w(1, 0);
      for (int j = 0; j < len / 2; ++j) {
        TPoint2D<double> u = a[i + j], v = a[i + j + len / 2] * w;
        a[i + j] = u + v;
        a[i + j + len / 2] = u - v;
        w = w * wlen;
      }
    }
  }
  if (invert)
    for (int i = 0; i < n; ++i) a[i] = a[i] * (1.0 / n);
}
vector<int> mul(const vector<int>& a, const vector<int>& b) {
  int n = 1;
  while (n < (int)a.size() + (int)b.size()) n *= 2;
  vector<TPoint2D<double> > x(n), y(n);
  for (int i = 0; i < a.size(); ++i) x[i] = TPoint2D<double>(a[i], 0);
  for (int i = 0; i < b.size(); ++i) y[i] = TPoint2D<double>(b[i], 0);
  fft(x, 0);
  fft(y, 0);
  for (int i = 0; i < x.size(); ++i) x[i] = x[i] * y[i];
  fft(x, 1);
  vector<int> res(a.size() + b.size());
  for (int i = 0; i < res.size(); ++i) res[i] = (long long)round(x[i].X);
  while (res.size() > 1 && res.back() == 0) res.pop_back();
  return res;
}
char s[SIZE];
int used[SIZE], tt;
int main() {
  int ___T, case_n = 1;
  scanf("%d ", &___T);
  while (___T-- > 0) {
    tt++;
    int(n);
    scanf("%d", &n);
    scanf("%s", (s));
    vector<int> a(n), b(n);
    for (int i = 0; i < (n); ++i) {
      if (s[i] == 'V') {
        a[i] = 1;
      } else if (s[i] == 'K') {
        b[n - 1 - i] = 1;
      }
    }
    vector<int> d = mul(a, b);
    vector<int> an;
    for (int i = 0; i < (((int)(d).size())); ++i) {
      if (d[i]) {
        used[abs(i - (n - 1))] = tt;
      }
    }
    for (int i = (1); i < (n + 1); ++i) {
      bool fail = 0;
      for (int j = i; j <= n; j += i) {
        if (used[j] == tt) fail = 1;
      }
      if (!fail) an.push_back(i);
    }
    printf("%d\n", ((int)(an).size()));
    for (int i = 0; i < (((int)(an).size())); ++i) {
      if (i) printf(" ");
      printf("%d", an[i]);
    }
    puts("");
  }
  return 0;
}
