Pagini recente » Cod sursa (job #1228643) | Cod sursa (job #2723089) | Cod sursa (job #142805) | Cod sursa (job #598857) | Cod sursa (job #678595)
Cod sursa(job #678595)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NMax 1000005
using namespace std;
int N, DP[2][NMax];
char X[NMax];
long long S;
int Expand (int L, int R)
{
int Length=0;
for (; L>0 and R<=N and X[L]==X[R]; --L, ++R, ++Length);
return Length;
}
void Solve (int T)
{
int P=0, R=0;
for (int i=1; i<=N; ++i)
{
if (T==1 and X[i]!=X[i+1])
{
continue;
}
if (R>=i+T)
{
DP[T][i]=min (DP[T][P-(i-P)], R-i-T);
}
DP[T][i]+=Expand (i-DP[T][i], i+T+DP[T][i]);
if (i+T+DP[T][i]>R)
{
P=i;
R=i+T+DP[T][i];
}
S+=((long long)DP[T][i]);
}
}
void Read ()
{
freopen ("pscpld.in", "r", stdin);
scanf ("%s", X);
N=strlen (X);
for (int i=N; i>0; --i)
{
X[i]=X[i-1];
}
}
void Print ()
{
freopen ("pscpld.out", "w", stdout);
printf ("%lld\n", S);
}
int main()
{
Read ();
Solve (0);
Solve (1);
Print ();
return 0;
}