Pagini recente » Cod sursa (job #1164812) | Cod sursa (job #1284102) | Cod sursa (job #147990) | Cod sursa (job #587594) | Cod sursa (job #1883799)
#include <iostream>
#include <cstdio>
#define NMAX 1000001
using namespace std;
char A[2 * NMAX + 1];
int LPS[2 * NMAX + 1], C, R, N;
long long nr;
void read()
{
freopen("pscpld.in", "r", stdin);
A[N++] = '#';
int c;
while(!feof(stdin))
{
scanf("%c", &c);
if(isalpha(c))
{
A[N++] = c;
A[N++] = '#';
}
}
}
void solve()
{
LPS[0] = 0;
LPS[1] = 1;
C = 1;
R = 2;
for(int i = 2; i < N; i++)
{
int ii = (C << 1) - i;
if(R<i)
LPS[i] = 0;
else
LPS[i] = min(R - i, LPS[ii]);
//Start expand
while(i - LPS[i] > 0 && i + LPS[i] < N)
{
if(A[i - LPS[i] - 1] == A[i + LPS[i] + 1])
LPS[i]++;
else
break;
}
//Stop expand
if(i + LPS[i] > R)
{
R = i + LPS[i];
C = i;
}
}
for(int i = 1; i < N - 1; i ++)
nr += ((LPS[i] + 1) >> 1);
}
void print()
{
freopen("pscpld.out", "w", stdout);
printf("%lld", nr);
}
int main()
{
read();
solve();
print();
return 0;
}