#include <bits/stdc++.h>
using namespace std;
const int mod = 998244353;
const int base = 311;
const int N = 100100;
struct minSegtree {
vector<int> t;
minSegtree (int sz = 0){
t = vector<int>(sz * 4, N);
}
void upd (int id, int l, int r, int k){
if (l == r){
t[id] = k;
return;
}
int m = l + r >> 1;
if (k <= m){
upd(id * 2, l, m, k);
} else {
upd(id * 2 + 1, m + 1, r, k);
}
t[id] = min(t[id * 2], t[id * 2 + 1]);
return;
}
int get (int id, int l, int r, int u, int v){
if (l > v || r < u){
return N;
}
if (l >= u && r <= v){
return t[id];
}
int m = l + r >> 1;
return min(get(id * 2, l, m, u, v), get(id * 2 + 1, m + 1, r, u, v));
}
};
struct maxSegtree {
vector<int> t;
maxSegtree (int sz = 0){
t = vector<int>(sz * 4, 0);
}
void upd (int id, int l, int r, int k){
if (l == r){
t[id] = k;
return;
}
int m = l + r >> 1;
if (k <= m){
upd(id * 2, l, m, k);
} else {
upd(id * 2 + 1, m + 1, r, k);
}
t[id] = max(t[id * 2], t[id * 2 + 1]);
return;
}
int get (int id, int l, int r, int u, int v){
if (l > v || r < u){
return 0;
}
if (l >= u && r <= v){
return t[id];
}
int m = l + r >> 1;
return max(get(id * 2, l, m, u, v), get(id * 2 + 1, m + 1, r, u, v));
}
};
int add (int a, int b){
a += b;
if (a >= mod){
a -= mod;
}
return a;
}
int sub (int a, int b){
a -= b;
if (a < 0){
a += mod;
}
return a;
}
int mul (int a, int b){
return 1ll * a * b % mod;
}
int n, pw[N], lhs[N], rhs[N], f[N], tl[N * 4], tr[N * 4], ans = 0, cnt = 0;
vector<int> pos;
string s;
minSegtree mino, mine;
maxSegtree maxo, maxe;
bool palindrome (int l, int r){
int L = sub(lhs[r], mul(lhs[l - 1], pw[r - l + 1]));
int R = sub(rhs[l], mul(rhs[r + 1], pw[r - l + 1]));
return (L == R);
}
void init (){
mino = mine = minSegtree(n + 7);
maxo = maxe = maxSegtree(n + 7);
sort(pos.begin(), pos.end(), [&](int i, int j){
return (f[i] > f[j]);
});
}
bool checkeq (int mid1, int mid2){
int l = mid1 - (mid2 - mid1 - 1) / 2;
int r = mid2 + (mid2 - mid1) / 2;
return palindrome(l, r);
}
int32_t main (){
ios::sync_with_stdio(false); cin.tie(nullptr);
const string task = "padble";
freopen ((task + ".inp").c_str(), "r", stdin);
freopen ((task + ".out").c_str(), "w", stdout);
cin >> s;
n = s.size();
s = '&' + s;
pw[0] = 1;
for (int i = 1; i < N; ++i){
pw[i] = mul(pw[i - 1], base);
}
lhs[0] = rhs[n + 1] = 0;
for (int i = 1; i <= n; ++i){
pos.push_back(i);
lhs[i] = add(mul(lhs[i - 1], base), (int)(s[i]));
}
for (int i = n; i >= 1; --i){
rhs[i] = add(mul(rhs[i + 1], base), (int)(s[i]));
}
for (int i = 1; i <= n; ++i){
int l = 1, r = min(i - 1, n - i);
f[i] = 0;
while (l <= r){
int m = l + r >> 1;
if (palindrome(i - m, i + m)){
f[i] = m;
l = m + 1;
} else {
r = m - 1;
}
}
}
init();
for (int &p : pos){
int l = max(1, p - 2 * f[p] - 1);
int r = min(n, p + 2 * f[p] + 1);
if (p & 1){
int L = mine.get(1, 1, n, l, p);
int R = maxe.get(1, 1, n, p, r);
if (!checkeq(L, p)){
ans = max(ans, 2 * (p - L));
}
if (!checkeq(p, R)){
ans = max(ans, 2 * (R - p));
}
mino.upd(1, 1, n, p);
maxo.upd(1, 1, n, p);
} else {
int L = mino.get(1, 1, n, l, p);
int R = maxo.get(1, 1, n, p, r);
if (!checkeq(L, p)){
ans = max(ans, 2 * (p - L));
}
if (!checkeq(p, R)){
ans = max(ans, 2 * (R - p));
}
mine.upd(1, 1, n, p);
maxe.upd(1, 1, n, p);
}
}
for (int i = 1; i <= n; ++i){
int l = 1, r = min(i, n - i);
f[i] = 0;
while (l <= r){
int m = l + r >> 1;
if (palindrome(i - m + 1, i + m)){
f[i] = m;
l = m + 1;
} else {
r = m - 1;
}
}
}
init();
for (int &p : pos){
if (f[p] == 0){
continue;
}
int l = max(1, p - 2 * f[p]);
int r = min(n, p + 2 * f[p]);
if (p & 1){
int L = mino.get(1, 1, n, l, p);
int R = maxo.get(1, 1, n, p, r);
if (!checkeq(L, p)){
ans = max(ans, 2 * (p - L));
}
if (!checkeq(p, R)){
ans = max(ans, 2 * (R - p));
}
mino.upd(1, 1, n, p);
maxo.upd(1, 1, n, p);
} else {
int L = mine.get(1, 1, n, l, p);
int R = maxe.get(1, 1, n, p, r);
if (!checkeq(L, p)){
ans = max(ans, 2 * (p - L));
}
if (!checkeq(p, R)){
ans = max(ans, 2 * (R - p));
}
mine.upd(1, 1, n, p);
maxe.upd(1, 1, n, p);
}
}
if (ans == 0){
cout << -1;
return 0;
}
for (int i = 1; i <= n - ans + 1; ++i){
if (palindrome(i, i + ans / 2 - 1) && palindrome(i + ans / 2, i + ans - 1) && !palindrome(i, i + ans - 1)){
++cnt;
}
}
if (cnt == 0 || ans == 0){
cout << -1;
return 0;
}
cout << ans << " " << cnt;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbW9kID0gOTk4MjQ0MzUzOwpjb25zdCBpbnQgYmFzZSA9IDMxMTsKY29uc3QgaW50IE4gPSAxMDAxMDA7CgpzdHJ1Y3QgbWluU2VndHJlZSB7CgogICAgdmVjdG9yPGludD4gdDsKCiAgICBtaW5TZWd0cmVlIChpbnQgc3ogPSAwKXsKICAgICAgICB0ID0gdmVjdG9yPGludD4oc3ogKiA0LCBOKTsKICAgIH0KCiAgICB2b2lkIHVwZCAoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCBrKXsKICAgICAgICBpZiAobCA9PSByKXsKICAgICAgICAgICAgdFtpZF0gPSBrOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGludCBtID0gbCArIHIgPj4gMTsKICAgICAgICBpZiAoayA8PSBtKXsKICAgICAgICAgICAgdXBkKGlkICogMiwgbCwgbSwgayk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdXBkKGlkICogMiArIDEsIG0gKyAxLCByLCBrKTsKICAgICAgICB9CiAgICAgICAgdFtpZF0gPSBtaW4odFtpZCAqIDJdLCB0W2lkICogMiArIDFdKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaW50IGdldCAoaW50IGlkLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdil7CiAgICAgICAgaWYgKGwgPiB2IHx8IHIgPCB1KXsKICAgICAgICAgICAgcmV0dXJuIE47CiAgICAgICAgfQogICAgICAgIGlmIChsID49IHUgJiYgciA8PSB2KXsKICAgICAgICAgICAgcmV0dXJuIHRbaWRdOwogICAgICAgIH0KICAgICAgICBpbnQgbSA9IGwgKyByID4+IDE7CiAgICAgICAgcmV0dXJuIG1pbihnZXQoaWQgKiAyLCBsLCBtLCB1LCB2KSwgZ2V0KGlkICogMiArIDEsIG0gKyAxLCByLCB1LCB2KSk7CiAgICB9Cgp9OwoKc3RydWN0IG1heFNlZ3RyZWUgewogICAgCiAgICB2ZWN0b3I8aW50PiB0OwoKICAgIG1heFNlZ3RyZWUgKGludCBzeiA9IDApewogICAgICAgIHQgPSB2ZWN0b3I8aW50PihzeiAqIDQsIDApOwogICAgfQoKICAgIHZvaWQgdXBkIChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IGspewogICAgICAgIGlmIChsID09IHIpewogICAgICAgICAgICB0W2lkXSA9IGs7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaW50IG0gPSBsICsgciA+PiAxOwogICAgICAgIGlmIChrIDw9IG0pewogICAgICAgICAgICB1cGQoaWQgKiAyLCBsLCBtLCBrKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1cGQoaWQgKiAyICsgMSwgbSArIDEsIHIsIGspOwogICAgICAgIH0KICAgICAgICB0W2lkXSA9IG1heCh0W2lkICogMl0sIHRbaWQgKiAyICsgMV0pOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpbnQgZ2V0IChpbnQgaWQsIGludCBsLCBpbnQgciwgaW50IHUsIGludCB2KXsKICAgICAgICBpZiAobCA+IHYgfHwgciA8IHUpewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKGwgPj0gdSAmJiByIDw9IHYpewogICAgICAgICAgICByZXR1cm4gdFtpZF07CiAgICAgICAgfQogICAgICAgIGludCBtID0gbCArIHIgPj4gMTsKICAgICAgICByZXR1cm4gbWF4KGdldChpZCAqIDIsIGwsIG0sIHUsIHYpLCBnZXQoaWQgKiAyICsgMSwgbSArIDEsIHIsIHUsIHYpKTsKICAgIH0KCn07CgppbnQgYWRkIChpbnQgYSwgaW50IGIpewogICAgYSArPSBiOwogICAgaWYgKGEgPj0gbW9kKXsKICAgICAgICBhIC09IG1vZDsKICAgIH0KICAgIHJldHVybiBhOwp9CgppbnQgc3ViIChpbnQgYSwgaW50IGIpewogICAgYSAtPSBiOwogICAgaWYgKGEgPCAwKXsKICAgICAgICBhICs9IG1vZDsKICAgIH0KICAgIHJldHVybiBhOwp9CgppbnQgbXVsIChpbnQgYSwgaW50IGIpewogICAgcmV0dXJuIDFsbCAqIGEgKiBiICUgbW9kOwp9CgppbnQgbiwgcHdbTl0sIGxoc1tOXSwgcmhzW05dLCBmW05dLCB0bFtOICogNF0sIHRyW04gKiA0XSwgYW5zID0gMCwgY250ID0gMDsKdmVjdG9yPGludD4gcG9zOwpzdHJpbmcgczsKbWluU2VndHJlZSBtaW5vLCBtaW5lOwptYXhTZWd0cmVlIG1heG8sIG1heGU7Cgpib29sIHBhbGluZHJvbWUgKGludCBsLCBpbnQgcil7CiAgICBpbnQgTCA9IHN1YihsaHNbcl0sIG11bChsaHNbbCAtIDFdLCBwd1tyIC0gbCArIDFdKSk7CiAgICBpbnQgUiA9IHN1YihyaHNbbF0sIG11bChyaHNbciArIDFdLCBwd1tyIC0gbCArIDFdKSk7CiAgICByZXR1cm4gKEwgPT0gUik7Cn0KCnZvaWQgaW5pdCAoKXsKICAgIG1pbm8gPSBtaW5lID0gbWluU2VndHJlZShuICsgNyk7CiAgICBtYXhvID0gbWF4ZSA9IG1heFNlZ3RyZWUobiArIDcpOwogICAgc29ydChwb3MuYmVnaW4oKSwgcG9zLmVuZCgpLCBbJl0oaW50IGksIGludCBqKXsKICAgICAgICByZXR1cm4gKGZbaV0gPiBmW2pdKTsKICAgIH0pOwp9Cgpib29sIGNoZWNrZXEgKGludCBtaWQxLCBpbnQgbWlkMil7CiAgICBpbnQgbCA9IG1pZDEgLSAobWlkMiAtIG1pZDEgLSAxKSAvIDI7CiAgICBpbnQgciA9IG1pZDIgKyAobWlkMiAtIG1pZDEpIC8gMjsKICAgIHJldHVybiBwYWxpbmRyb21lKGwsIHIpOwp9CgppbnQzMl90IG1haW4gKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IGNpbi50aWUobnVsbHB0cik7CiAgICBjb25zdCBzdHJpbmcgdGFzayA9ICJwYWRibGUiOwogICAgZnJlb3BlbiAoKHRhc2sgKyAiLmlucCIpLmNfc3RyKCksICJyIiwgc3RkaW4pOwogICAgZnJlb3BlbiAoKHRhc2sgKyAiLm91dCIpLmNfc3RyKCksICJ3Iiwgc3Rkb3V0KTsKICAgIGNpbiA+PiBzOwogICAgbiA9IHMuc2l6ZSgpOwogICAgcyA9ICcmJyArIHM7CiAgICBwd1swXSA9IDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IE47ICsraSl7CiAgICAgICAgcHdbaV0gPSBtdWwocHdbaSAtIDFdLCBiYXNlKTsKICAgIH0KICAgIGxoc1swXSA9IHJoc1tuICsgMV0gPSAwOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKXsKICAgICAgICBwb3MucHVzaF9iYWNrKGkpOwogICAgICAgIGxoc1tpXSA9IGFkZChtdWwobGhzW2kgLSAxXSwgYmFzZSksIChpbnQpKHNbaV0pKTsKICAgIH0KICAgIGZvciAoaW50IGkgPSBuOyBpID49IDE7IC0taSl7CiAgICAgICAgcmhzW2ldID0gYWRkKG11bChyaHNbaSArIDFdLCBiYXNlKSwgKGludCkoc1tpXSkpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgKytpKXsKICAgICAgICBpbnQgbCA9IDEsIHIgPSBtaW4oaSAtIDEsIG4gLSBpKTsKICAgICAgICBmW2ldID0gMDsKICAgICAgICB3aGlsZSAobCA8PSByKXsKICAgICAgICAgICAgaW50IG0gPSBsICsgciA+PiAxOwogICAgICAgICAgICBpZiAocGFsaW5kcm9tZShpIC0gbSwgaSArIG0pKXsKICAgICAgICAgICAgICAgIGZbaV0gPSBtOwogICAgICAgICAgICAgICAgbCA9IG0gKyAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgciA9IG0gLSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaW5pdCgpOwogICAgZm9yIChpbnQgJnAgOiBwb3MpewogICAgICAgIGludCBsID0gbWF4KDEsIHAgLSAyICogZltwXSAtIDEpOwogICAgICAgIGludCByID0gbWluKG4sIHAgKyAyICogZltwXSArIDEpOwogICAgICAgIGlmIChwICYgMSl7CiAgICAgICAgICAgIGludCBMID0gbWluZS5nZXQoMSwgMSwgbiwgbCwgcCk7CiAgICAgICAgICAgIGludCBSID0gbWF4ZS5nZXQoMSwgMSwgbiwgcCwgcik7CiAgICAgICAgICAgIGlmICghY2hlY2tlcShMLCBwKSl7CiAgICAgICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCAyICogKHAgLSBMKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFjaGVja2VxKHAsIFIpKXsKICAgICAgICAgICAgICAgIGFucyA9IG1heChhbnMsIDIgKiAoUiAtIHApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtaW5vLnVwZCgxLCAxLCBuLCBwKTsKICAgICAgICAgICAgbWF4by51cGQoMSwgMSwgbiwgcCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IEwgPSBtaW5vLmdldCgxLCAxLCBuLCBsLCBwKTsKICAgICAgICAgICAgaW50IFIgPSBtYXhvLmdldCgxLCAxLCBuLCBwLCByKTsKICAgICAgICAgICAgaWYgKCFjaGVja2VxKEwsIHApKXsKICAgICAgICAgICAgICAgIGFucyA9IG1heChhbnMsIDIgKiAocCAtIEwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNoZWNrZXEocCwgUikpewogICAgICAgICAgICAgICAgYW5zID0gbWF4KGFucywgMiAqIChSIC0gcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1pbmUudXBkKDEsIDEsIG4sIHApOwogICAgICAgICAgICBtYXhlLnVwZCgxLCAxLCBuLCBwKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpewogICAgICAgIGludCBsID0gMSwgciA9IG1pbihpLCBuIC0gaSk7CiAgICAgICAgZltpXSA9IDA7CiAgICAgICAgd2hpbGUgKGwgPD0gcil7CiAgICAgICAgICAgIGludCBtID0gbCArIHIgPj4gMTsKICAgICAgICAgICAgaWYgKHBhbGluZHJvbWUoaSAtIG0gKyAxLCBpICsgbSkpewogICAgICAgICAgICAgICAgZltpXSA9IG07CiAgICAgICAgICAgICAgICBsID0gbSArIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByID0gbSAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpbml0KCk7CiAgICBmb3IgKGludCAmcCA6IHBvcyl7CiAgICAgICAgaWYgKGZbcF0gPT0gMCl7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpbnQgbCA9IG1heCgxLCBwIC0gMiAqIGZbcF0pOwogICAgICAgIGludCByID0gbWluKG4sIHAgKyAyICogZltwXSk7CiAgICAgICAgaWYgKHAgJiAxKXsKICAgICAgICAgICAgaW50IEwgPSBtaW5vLmdldCgxLCAxLCBuLCBsLCBwKTsKICAgICAgICAgICAgaW50IFIgPSBtYXhvLmdldCgxLCAxLCBuLCBwLCByKTsKICAgICAgICAgICAgaWYgKCFjaGVja2VxKEwsIHApKXsKICAgICAgICAgICAgICAgIGFucyA9IG1heChhbnMsIDIgKiAocCAtIEwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWNoZWNrZXEocCwgUikpewogICAgICAgICAgICAgICAgYW5zID0gbWF4KGFucywgMiAqIChSIC0gcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1pbm8udXBkKDEsIDEsIG4sIHApOwogICAgICAgICAgICBtYXhvLnVwZCgxLCAxLCBuLCBwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgTCA9IG1pbmUuZ2V0KDEsIDEsIG4sIGwsIHApOwogICAgICAgICAgICBpbnQgUiA9IG1heGUuZ2V0KDEsIDEsIG4sIHAsIHIpOwogICAgICAgICAgICBpZiAoIWNoZWNrZXEoTCwgcCkpewogICAgICAgICAgICAgICAgYW5zID0gbWF4KGFucywgMiAqIChwIC0gTCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY2hlY2tlcShwLCBSKSl7CiAgICAgICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCAyICogKFIgLSBwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWluZS51cGQoMSwgMSwgbiwgcCk7CiAgICAgICAgICAgIG1heGUudXBkKDEsIDEsIG4sIHApOwogICAgICAgIH0KICAgIH0KICAgIGlmIChhbnMgPT0gMCl7CiAgICAgICAgY291dCA8PCAtMTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG4gLSBhbnMgKyAxOyArK2kpewogICAgICAgIGlmIChwYWxpbmRyb21lKGksIGkgKyBhbnMgLyAyIC0gMSkgJiYgcGFsaW5kcm9tZShpICsgYW5zIC8gMiwgaSArIGFucyAtIDEpICYmICFwYWxpbmRyb21lKGksIGkgKyBhbnMgLSAxKSl7CiAgICAgICAgICAgICsrY250OwogICAgICAgIH0KICAgIH0KICAgIGlmIChjbnQgPT0gMCB8fCBhbnMgPT0gMCl7CiAgICAgICAgY291dCA8PCAtMTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGNvdXQgPDwgYW5zIDw8ICIgIiA8PCBjbnQ7Cn0K