Pagini recente » Cod sursa (job #1854609) | Cod sursa (job #2036817) | Cod sursa (job #2100747) | Cod sursa (job #1105492) | Cod sursa (job #2901913)
#include <bits/stdc++.h>
using namespace std;
ifstream in("pscpld.in");
ofstream out("pscpld.out");
char a[2000005];
int mn[2000005],n;
int main()
{
char ch;
n = 1;
a[1] = '*';
while (in >> ch)
{
n++;
a[n] = ch;
n++;
a[n] = '*';
}
int l = 0,r = 0;
for (int i = 1; i <= n; i++)
{
if (i > r)
{
l = i;
mn[i] = 0;
int st = i,dr = i;
while (st > 1 and dr < n and a[st - 1] == a[dr + 1])
st--,dr++,mn[i]++;
}
else
{
int mid = (r + l) / 2;
int ip = 2 * mid - i;
int left = ip - l;
if (mn[ip] < left)
mn[i] = mn[ip];
else
{
mn[i] = r - i;
int dr = r;
int st = 2 * i - r;
while (st > 1 and dr < n and a[st - 1] == a[dr + 1])
st--,dr++,mn[i]++;
}
}
}
long long sum = 0;
for (int i = 2; i <= n; i += 2)
sum += 1 + mn[i] / 2;
for (int i = 1; i <= n; i += 2)
sum += mn[i] / 2;
out << sum;
return 0;
}