Pagini recente » Cod sursa (job #2758995) | Cod sursa (job #2917672) | Cod sursa (job #2313556) | Cod sursa (job #233275) | Cod sursa (job #2638166)
#include <fstream>
#include <string>
using namespace std;
ifstream cin("pscpld.in");
ofstream cout("pscpld.out");
const int NMAX = 2e6;
string s;
long long ans;
int manacher[NMAX + 2];
void Manacher()
{
int drMax = 0, posDrMax = 0;
for(int i = 1; i < (int)s.size() - 1; i++)
{
if(i > drMax)
{
int st = i - 1, dr = i + 1;
while(st >= 0 && dr < (int)s.size() && s[st] == s[dr])
st--, dr++;
st++, dr--;
manacher[i] = dr - i;
drMax = dr;
posDrMax = i;
}
else
{
if(i + manacher[2 * posDrMax - i] < drMax)
manacher[i] = manacher[2 * posDrMax - i];
else
{
int st = 2 * i - drMax, dr = drMax;
while(st >= 0 && dr < (int)s.size() && s[st] == s[dr])
st--, dr++;
st++, dr--;
manacher[i] = dr - i;
drMax = dr;
posDrMax = i;
}
}
if(s[i] == '*')
ans += 1LL * (manacher[i] + 1) / 2;
else
ans += 1LL * (manacher[i] + 2) / 2;
}
}
int main()
{
string aux;
cin >> aux;
s += '*';
for(auto it : aux)
s += it, s += '*';
Manacher();
cout << ans << '\n';
return 0;
}