using
System;
public
class
GFG
{
static
readonly
int
MOD = 1_000_000_007;
static
readonly
int
P = 37;
static
readonly
int
MAXN = 100_005;
static
int
[] prefixHash =
new
int
[MAXN];
static
int
[] suffixHash =
new
int
[MAXN];
static
int
[] inversePrefix =
new
int
[MAXN];
static
int
[] inverseSuffix =
new
int
[MAXN];
static
int
n;
static
int
power(
int
x,
int
y,
int
mod)
{
if
(x == 0)
return
0;
int
ans = 1;
while
(y > 0)
{
if
((y & 1) == 1)
ans = (
int
)(((
long
)ans * x) % mod);
x = (
int
)(((
long
)x * x) % mod);
y >>= 1;
}
return
ans;
}
static
void
preCompute(
string
s)
{
int
x = 1;
for
(
int
i = 0; i < n; i++)
{
prefixHash[i] = (
int
)(((
long
)(s[i] -
'a'
+ 1) * x) % MOD);
if
(i > 0)
prefixHash[i] = (prefixHash[i] + prefixHash[i - 1]) % MOD;
inversePrefix[i] = power(x, MOD - 2, MOD);
x = (
int
)(((
long
)x * P) % MOD);
}
x = 1;
for
(
int
i = n - 1; i >= 0; i--)
{
suffixHash[i] = (
int
)(((
long
)(s[i] -
'a'
+ 1) * x) % MOD);
if
(i < n - 1)
suffixHash[i] = (suffixHash[i] + suffixHash[i + 1]) % MOD;
inverseSuffix[i] = power(x, MOD - 2, MOD);
x = (
int
)(((
long
)x * P) % MOD);
}
}
static
int
getPrefixHash(
int
l,
int
r)
{
int
h = prefixHash[r];
if
(l > 0)
h = (h - prefixHash[l - 1] + MOD) % MOD;
h = (
int
)(((
long
)h * inversePrefix[l]) % MOD);
return
h;
}
static
int
getSuffixHash(
int
l,
int
r)
{
int
h = suffixHash[l];
if
(r < n - 1)
h = (h - suffixHash[r + 1] + MOD) % MOD;
h = (
int
)(((
long
)h * inverseSuffix[r]) % MOD);
return
h;
}
static
int
numWays(
string
s)
{
n = s.Length;
preCompute(s);
int
ans = 0;
for
(
int
i = 0; i < n - 1; i++)
{
int
preHash = getPrefixHash(0, i);
int
sufHash = getSuffixHash(0, i);
if
(preHash != sufHash)
continue
;
preHash = getPrefixHash(i + 1, n - 1);
sufHash = getSuffixHash(i + 1, n - 1);
if
(preHash != sufHash)
continue
;
ans++;
}
return
ans;
}
public
static
void
Main(
string
[] args)
{
string
s =
"aaaaa"
;
int
ans = numWays(s);
Console.WriteLine(ans);
}
}