Pagini recente » Cod sursa (job #2339872) | Cod sursa (job #578189) | Cod sursa (job #1223070) | Cod sursa (job #1576861) | Cod sursa (job #1883807)
#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++] = '#';
char c;
while(!feof(stdin))
{
scanf("%c", &c);
if(c >= 'a' && c <= 'z')
{
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;
}