#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T& a, U b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T& a, U b) {
  if (a < b) a = b;
}
char s[500500];
int vst[500500];
vector<int> a, b, c, ans;
namespace FFT {
const int mod = 998244353;
const int root = 31;
const int root_1 = 128805723;
const int root_pw = 1 << 23;
int mPow(int a, int first) {
  int ret = 1;
  while (first > 0) {
    if (first & 1) ret = 1LL * ret * a % mod;
    a = 1LL * a * a % mod;
    first >>= 1;
  }
  return ret;
}
void fft(vector<int>& a, bool invert) {
  int n = a.size();
  int PW = invert ? root_1 : root;
  for (int i = n; i < root_pw; i <<= 1) PW = 1LL * PW * PW % mod;
  for (int m = n, h; h = m / 2, m >= 2; PW = 1LL * PW * PW % mod, m = h) {
    for (int i = 0, w = 1; i < h; ++i, w = 1LL * w * PW % mod)
      for (int j = i; j < n; j += m) {
        int k = j + h, first = (a[j] - a[k] + mod) % mod;
        a[j] += a[k];
        a[j] %= mod;
        a[k] = 1LL * w * first % mod;
      }
  }
  for (int i = 0, j = 1; j < n - 1; ++j) {
    for (int k = n / 2; k > (i ^= k); k /= 2)
      ;
    if (j < i) swap(a[i], a[j]);
  }
  if (invert) {
    int rev = mPow(n, mod - 2);
    for (int i = 0; i < n; ++i) a[i] = 1LL * a[i] * rev % mod;
  }
}
vector<int> multiply(const vector<int>& a, const vector<int>& b) {
  int n = max(a.size(), b.size());
  vector<int> na = a, nb = b;
  na.resize(2 * n);
  nb.resize(2 * n);
  fft(na, false);
  fft(nb, false);
  for (int i = 0; i < 2 * n; ++i) na[i] = 1LL * na[i] * nb[i] % mod;
  fft(na, true);
  return na;
}
vector<int> findInverse(const vector<int>& f) {
  int n = f.size();
  vector<int> r(1, mPow(f[0], mod - 2));
  for (int it = 2; it <= n; it <<= 1) {
    vector<int> nr =
        multiply(multiply(r, r), vector<int>(f.begin(), f.begin() + it));
    nr.resize(it);
    for (int i = 0; i < nr.size(); ++i) {
      nr[i] = mod - nr[i];
    }
    for (int i = 0; i < it / 2; ++i) {
      nr[i] = (2LL * r[i] + nr[i]) % mod;
    }
    r = nr;
  }
  return r;
}
bool checkInverse(const vector<int>& a, const vector<int>& b) {
  for (int i = 0; i < a.size(); ++i) {
    int val = 0;
    for (int j = 0; j <= i; ++j) {
      val = (val + 1LL * a[i - j] * b[j]) % mod;
    }
    if (val != (i == 0)) return false;
  }
  return true;
}
vector<int> squareRoot(const vector<int>& f) {
  int n = f.size();
  vector<int> r(1, 1);
  int inv2 = mPow(2, mod - 2);
  for (int it = 2; it <= n; it <<= 1) {
    r.resize(it);
    vector<int> res =
        multiply(findInverse(r), vector<int>(f.begin(), f.begin() + it));
    res.resize(it);
    for (int i = 0; i < r.size(); ++i) {
      res[i] += r[i];
      if (res[i] >= mod) res[i] -= mod;
    }
    for (int i = 0; i < res.size(); ++i) res[i] = 1LL * res[i] * inv2 % mod;
    r = res;
  }
  return r;
}
};  // namespace FFT
int main() {
  int T, n, m;
  for (scanf("%d", &T); T--;) {
    scanf("%d ", &m);
    gets(s);
    n = 1;
    while (n < m) n <<= 1;
    a = b = vector<int>(n, 0);
    int ca = 0, cb = 0;
    for (int i = 0; i < m; i++) {
      if (s[i] == 'V')
        a[i] = 1, ca++;
      else if (s[i] == 'K')
        b[i] = 1, cb++;
    }
    if (!ca || !cb) {
      printf("%d\n", m);
      for (int i = 1; i <= m; i++) printf("%d ", i);
      puts("");
      continue;
    }
    for (int i = 1; i <= m; i++) vst[i] = 0;
    reverse(a.begin(), a.end());
    c = FFT::multiply(a, b);
    for (int i = n; i < n + m; i++) {
      if (c[i]) vst[i - n + 1] = 1;
    }
    reverse(a.begin(), a.end());
    reverse(b.begin(), b.end());
    c = FFT::multiply(a, b);
    for (int i = n; i < n + m; i++) {
      if (c[i]) vst[i - n + 1] = 1;
    }
    ans.clear();
    for (int i = 2; i < m; i++) {
      int ok = 0;
      for (int j = i; j < m; j += i) {
        if (vst[j]) {
          ok = 1;
          break;
        }
      }
      if (!ok) ans.push_back(i);
    }
    ans.push_back(m);
    printf("%d\n", ans.size());
    for (int i = 0; i < ans.size(); i++) {
      printf("%d ", ans[i]);
    }
    puts("");
  }
  return 0;
}
