Pagini recente » Cod sursa (job #711260) | Cod sursa (job #2020377) | Cod sursa (job #951019) | Cod sursa (job #211067) | Cod sursa (job #1883767)
#include <iostream>
#include <cstdio>
#define NMAX 1000001
using namespace std;
char A[2 * NMAX + 1];
long long LPS[2 * NMAX + 1], C, R, N, lmax, cmax, 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;
lmax = cmax = 1;
for(int i = 2; i < N; i++)
{
int ii = 2 * C - 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((i - LPS[i] - 1) % 2 == 0)
LPS[i]++;
else if(A[i - LPS[i] - 1] == A[i + LPS[i] + 1])
LPS[i]++;
else
break;
}
//Stop expand
if(lmax < LPS[i])
{
lmax = LPS[i];
cmax = i;
}
if(i + LPS[i] > R)
{
R = i + LPS[i];
C = i;
}
}
for(int i = 1; i < N - 1; i ++)
nr += ((LPS[i] + 1) / 2);
}
void print()
{
freopen("pscpld.out", "w", stdout);
printf("%lld", nr);
}
int main()
{
read();
solve();
print();
return 0;
}