Pagini recente » Cod sursa (job #2144583) | Cod sursa (job #1700567) | Cod sursa (job #2943397) | Cod sursa (job #405720) | Cod sursa (job #446516)
Cod sursa(job #446516)
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <ctime>
#define FIN "pscpld.in"
#define FOUT "pscpld.out"
#define NMAX 1000010
using namespace std;
char sz[NMAX];
int lg[NMAX * 2], dim = 0;
bool mid[NMAX * 2];
int main()
{
long long ret = 0, cnt = 0;
int tmp, i, j, l, r, il, ir;
char c;
FILE *fin = freopen(FIN, "r", stdin), *fout = freopen(FOUT, "w", stdout);
for (c = getchar(); c >= 'a' && c <= 'z'; c = getchar()) sz[++dim] = c;
for (i = dim; i; --i)
{
if (sz[i] != sz[i-1])
{
lg[(i << 1) - 1] = 1;
mid[(i << 1) - 1] = true;
continue;
}
tmp = 1; l = 0;
for (; i; --i)
{
if (sz[i] != sz[i-1]) break;
lg[(i << 1) - 1] = tmp;
lg[i << 1] = tmp - 1;
tmp += 2;
++l;
}
tmp = 1;
for (j = i; j < i + ((l + 1) >> 1); ++j, tmp += 2)
{
lg[(j << 1) - 1] = tmp;
lg[j << 1] = tmp + 1;
}
if (l & 1) mid[(i + (l >> 1)) << 1] = true;
else mid[((i + (l >> 1)) << 1) - 1] = true;
}
for (i = 1; i <= (dim << 1) - 1; ++i)
{
if (i & 1) l = ((i + 1) >> 1) - ((lg[i] + 1) >> 1) , r = ((i + 1) >> 1) + ((lg[i] + 1) >> 1);
else l = (i - lg[i]) >> 1, r = ((i + lg[i]) >> 1) + 1;
if (mid[i])
{
j = lg[i];
tmp = l;
while (l > 0 && (r <= dim))
if (sz[l] == sz[r]) --l, ++r;
else break;
lg[i] += (tmp - l) << 1;
++l; --r;
for (il = (l << 1) - 1, ir = (r << 1) - 1; ir - il + 1 >= j && (mid[ir] || mid[il]); ++il, --ir)
if (il & 1) lg[ir] = max(lg[ir], min(lg[il], min(i - il + 1, il - (l << 1))));
else lg[ir] = max(lg[ir], min(lg[il], min(i - il + 1, il - (l << 1) + 2)));
}
ret += ((long long)lg[i] + 1) >> 1;
}
printf("%lld\n", ret);
return 0;
}