// submitted by DeadlyPoison
#include <bits/stdc++.h>
#ifndef ONLINE_JUDGE
#include "debug.h"
#else
#define debug(...) 42
#endif
using namespace std;
typedef long long ll;
typedef unsigned int uint;
#define pii pair<int, int>
#define pll pair<ll, ll>
#define vi vector<int>
#define vll vector<ll>
#define vpii vector<pii>
#define vpll vector<pll>
#define mii map<int, int>
#define mll map<ll, ll>
#define all(v) ((v).begin()), ((v).end())
#define allr(v) ((v).rbegin()), ((v).rend())
#define f first
#define s second
#define pb push_back
#define pf push_front
#define el '\n'
#define loop(i, ini, n) for (int i = ini; i < n; i++)
#define loope(i, ini, n) for (int i = ini; i <= n; i++)
#define loopdez(i, ini) for (int i = ini; i >= 0; i--)
#define loopde(i, ini, n) for (int i = ini; i >= n; i--)
#define loopd(i, ini, n) for (int i = ini; i > n; i--)
#define sz(v) ((int)((v).size()))
#define LOOP(n) for (int i = 0; i < n; i++)
#define mx(v) *max_element(all(v))
#define mn(v) *min_element(all(v))
#define up(x) transform(all(x), x.begin(), ::toupper)
#define down(x) transform(all(x), x.begin(), ::tolower)
#define inf LLONG_MAX
//======================================================
// freopen("input.in", "r", stdin);
// freopen("output.out", "w", stdout);
//======================================================
void fast()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
//======================================================
const ll N = 30000 + 5, base2 = 131, base1 = 127, mod1 = 1e9 + 7, mod2 = 2e9 + 11;
ll pw1[N], pw2[N];
ll powmod(ll x, ll y, ll m)
{
ll res = 1;
x = x % m;
if (x == 0)
return 0;
while (y > 0)
{
if (y & 1)
res = (res * x) % m;
y = y >> 1;
x = (x * x) % m;
}
return res;
}
void init()
{
pw1[0] = 1;
pw2[0] = 1;
for (int i = 1; i < N; i++)
{
pw1[i] = (1LL * pw1[i - 1] * base1) % mod1;
pw2[i] = (1LL * pw2[i - 1] * base2) % mod2;
}
}
pair<ll, ll> pref[N];
pair<ll, ll> get(ll l, ll r, pair<ll, ll> pp[])
{
auto ret = pp[r];
ll szz = r - l + 1;
l--;
if (l >= 0)
{
ret.f -= (pp[l].f * pw1[szz]) % mod1;
ret.s -= (pp[l].s * pw2[szz]) % mod2;
}
if (ret.f < 0)
ret.f += mod1;
if (ret.s < 0)
ret.s += mod2;
return ret;
}
void Hash(string st, pair<ll, ll> p[])
{
ll h1 = 0, h2 = 0;
LOOP(sz(st))
{
char dig = st[i];
h1 = ((h1 * base1) % mod1 + dig) % mod1;
h2 = ((h2 * base2) % mod2 + dig) % mod2;
p[i] = {h1, h2};
}
}
void solve()
{
string st;
cin >> st;
int n = sz(st);
Hash(st, pref);
loop(i, 1, n)
{
auto h1 = pref[i - 1];
int cnt = 0;
int ps = n / i;
if (ps * i == n)
ps--;
for (int j = i - 1; j < n - 1; j += i)
{
auto h2 = get(j - i + 1, j, pref);
if (h1 == h2)
cnt++;
}
if (cnt == ps)
{
if (get(0, n % i - 1, pref) == get(n - n % i, n - 1, pref))
cout
<< i << ' ';
}
}
cout << n << ' ';
cout << el;
}
int main()
{
fast();
init();
int t = 1;
// cin >> t;
// int tt=t;
loope(i, 1, t)
{
solve();
}
return 0;
}
Ly8gc3VibWl0dGVkIGJ5IERlYWRseVBvaXNvbgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KI2lmbmRlZiBPTkxJTkVfSlVER0UKI2luY2x1ZGUgImRlYnVnLmgiCiNlbHNlCiNkZWZpbmUgZGVidWcoLi4uKSA0MgojZW5kaWYKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CiNkZWZpbmUgcGlpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgcGxsIHBhaXI8bGwsIGxsPgojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgdmxsIHZlY3RvcjxsbD4KI2RlZmluZSB2cGlpIHZlY3RvcjxwaWk+CiNkZWZpbmUgdnBsbCB2ZWN0b3I8cGxsPgojZGVmaW5lIG1paSBtYXA8aW50LCBpbnQ+CiNkZWZpbmUgbWxsIG1hcDxsbCwgbGw+CiNkZWZpbmUgYWxsKHYpICgodikuYmVnaW4oKSksICgodikuZW5kKCkpCiNkZWZpbmUgYWxscih2KSAoKHYpLnJiZWdpbigpKSwgKCh2KS5yZW5kKCkpCiNkZWZpbmUgZiBmaXJzdAojZGVmaW5lIHMgc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgcGYgcHVzaF9mcm9udAojZGVmaW5lIGVsICdcbicKI2RlZmluZSBsb29wKGksIGluaSwgbikgZm9yIChpbnQgaSA9IGluaTsgaSA8IG47IGkrKykKI2RlZmluZSBsb29wZShpLCBpbmksIG4pIGZvciAoaW50IGkgPSBpbmk7IGkgPD0gbjsgaSsrKQojZGVmaW5lIGxvb3BkZXooaSwgaW5pKSBmb3IgKGludCBpID0gaW5pOyBpID49IDA7IGktLSkKI2RlZmluZSBsb29wZGUoaSwgaW5pLCBuKSBmb3IgKGludCBpID0gaW5pOyBpID49IG47IGktLSkKI2RlZmluZSBsb29wZChpLCBpbmksIG4pIGZvciAoaW50IGkgPSBpbmk7IGkgPiBuOyBpLS0pCiNkZWZpbmUgc3oodikgKChpbnQpKCh2KS5zaXplKCkpKQojZGVmaW5lIExPT1AobikgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiNkZWZpbmUgbXgodikgKm1heF9lbGVtZW50KGFsbCh2KSkKI2RlZmluZSBtbih2KSAqbWluX2VsZW1lbnQoYWxsKHYpKQojZGVmaW5lIHVwKHgpIHRyYW5zZm9ybShhbGwoeCksIHguYmVnaW4oKSwgOjp0b3VwcGVyKQojZGVmaW5lIGRvd24oeCkgdHJhbnNmb3JtKGFsbCh4KSwgeC5iZWdpbigpLCA6OnRvbG93ZXIpCiNkZWZpbmUgaW5mIExMT05HX01BWAoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vICBmcmVvcGVuKCJpbnB1dC5pbiIsICJyIiwgc3RkaW4pOwovLyAgZnJlb3Blbigib3V0cHV0Lm91dCIsICJ3Iiwgc3Rkb3V0KTsKCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp2b2lkIGZhc3QoKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBjb3V0LnRpZShudWxscHRyKTsKfQoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KY29uc3QgbGwgTiA9IDMwMDAwICsgNSwgYmFzZTIgPSAxMzEsIGJhc2UxID0gMTI3LCBtb2QxID0gMWU5ICsgNywgbW9kMiA9IDJlOSArIDExOwpsbCBwdzFbTl0sIHB3MltOXTsKbGwgcG93bW9kKGxsIHgsIGxsIHksIGxsIG0pCnsKICAgIGxsIHJlcyA9IDE7CiAgICB4ID0geCAlIG07CiAgICBpZiAoeCA9PSAwKQogICAgICAgIHJldHVybiAwOwogICAgd2hpbGUgKHkgPiAwKQogICAgewogICAgICAgIGlmICh5ICYgMSkKICAgICAgICAgICAgcmVzID0gKHJlcyAqIHgpICUgbTsKICAgICAgICB5ID0geSA+PiAxOwogICAgICAgIHggPSAoeCAqIHgpICUgbTsKICAgIH0KICAgIHJldHVybiByZXM7Cn0Kdm9pZCBpbml0KCkKewogICAgcHcxWzBdID0gMTsKICAgIHB3MlswXSA9IDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IE47IGkrKykKICAgIHsKICAgICAgICBwdzFbaV0gPSAoMUxMICogcHcxW2kgLSAxXSAqIGJhc2UxKSAlIG1vZDE7CiAgICAgICAgcHcyW2ldID0gKDFMTCAqIHB3MltpIC0gMV0gKiBiYXNlMikgJSBtb2QyOwogICAgfQp9CgpwYWlyPGxsLCBsbD4gcHJlZltOXTsKCnBhaXI8bGwsIGxsPiBnZXQobGwgbCwgbGwgciwgcGFpcjxsbCwgbGw+IHBwW10pCnsKICAgIGF1dG8gcmV0ID0gcHBbcl07CiAgICBsbCBzenogPSByIC0gbCArIDE7CiAgICBsLS07CiAgICBpZiAobCA+PSAwKQogICAgewogICAgICAgIHJldC5mIC09IChwcFtsXS5mICogcHcxW3N6el0pICUgbW9kMTsKCiAgICAgICAgcmV0LnMgLT0gKHBwW2xdLnMgKiBwdzJbc3p6XSkgJSBtb2QyOwogICAgfQogICAgaWYgKHJldC5mIDwgMCkKICAgICAgICByZXQuZiArPSBtb2QxOwogICAgaWYgKHJldC5zIDwgMCkKICAgICAgICByZXQucyArPSBtb2QyOwogICAgcmV0dXJuIHJldDsKfQp2b2lkIEhhc2goc3RyaW5nIHN0LCBwYWlyPGxsLCBsbD4gcFtdKQp7CiAgICBsbCBoMSA9IDAsIGgyID0gMDsKICAgIExPT1Aoc3ooc3QpKQogICAgewogICAgICAgIGNoYXIgZGlnID0gc3RbaV07CiAgICAgICAgaDEgPSAoKGgxICogYmFzZTEpICUgbW9kMSArIGRpZykgJSBtb2QxOwogICAgICAgIGgyID0gKChoMiAqIGJhc2UyKSAlIG1vZDIgKyBkaWcpICUgbW9kMjsKICAgICAgICBwW2ldID0ge2gxLCBoMn07CiAgICB9Cn0Kdm9pZCBzb2x2ZSgpCnsKICAgIHN0cmluZyBzdDsKICAgIGNpbiA+PiBzdDsKICAgIGludCBuID0gc3ooc3QpOwogICAgSGFzaChzdCwgcHJlZik7CiAgICBsb29wKGksIDEsIG4pCiAgICB7CiAgICAgICAgYXV0byBoMSA9IHByZWZbaSAtIDFdOwogICAgICAgIGludCBjbnQgPSAwOwogICAgICAgIGludCBwcyA9IG4gLyBpOwogICAgICAgIGlmIChwcyAqIGkgPT0gbikKICAgICAgICAgICAgcHMtLTsKCiAgICAgICAgZm9yIChpbnQgaiA9IGkgLSAxOyBqIDwgbiAtIDE7IGogKz0gaSkKICAgICAgICB7CiAgICAgICAgICAgIGF1dG8gaDIgPSBnZXQoaiAtIGkgKyAxLCBqLCBwcmVmKTsKICAgICAgICAgICAgaWYgKGgxID09IGgyKQogICAgICAgICAgICAgICAgY250Kys7CiAgICAgICAgfQogICAgICAgIGlmIChjbnQgPT0gcHMpCiAgICAgICAgewogICAgICAgICAgICBpZiAoZ2V0KDAsIG4gJSBpIC0gMSwgcHJlZikgPT0gZ2V0KG4gLSBuICUgaSwgbiAtIDEsIHByZWYpKQogICAgICAgICAgICAgICAgY291dAogICAgICAgICAgICAgICAgICAgIDw8IGkgPDwgJyAnOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQgPDwgbiA8PCAnICc7CiAgICBjb3V0IDw8IGVsOwp9CmludCBtYWluKCkKewogICAgZmFzdCgpOwogICAgaW5pdCgpOwogICAgaW50IHQgPSAxOwogICAgLy8gY2luID4+IHQ7CiAgICAvLyBpbnQgdHQ9dDsKICAgIGxvb3BlKGksIDEsIHQpCiAgICB7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAwOwp9