Pagini recente » Cod sursa (job #1669265) | Cod sursa (job #391288) | Cod sursa (job #1732299) | Cod sursa (job #1207426) | Cod sursa (job #1926150)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
char s[1000005];
int n, p, r, DP[2][1000005], lef_t, righ_t;
long long sol;
void Read()
{
f>>s;
n = strlen(s);
for(int i = n; i > 0; i--) s[i] = s[i-1];
}
int Expand(int li, int ls)
{
int cont = 0;
while(s[li] == s[ls] && li > 0 && ls <= n)
{
li--;
ls++;
cont++;
}
return cont;
}
void SolveOdd()
{
p = r = 0;
for(int i = 1; i <= n; i++)
{
if(i <= r) DP[0][i] = min(DP[0][p-(i-p)], r-i);
lef_t = i-DP[0][i];
righ_t = i+DP[0][i];
DP[0][i]+=Expand(lef_t, righ_t);
if(DP[0][i]+i>r)
{
p = i;
r = i+DP[0][i];
}
sol += (long long) DP[0][i];
}
}
void SolveEven()
{
p = r = 0;
for(int i = 1; i <= n; i++)
{
if(s[i]!=s[i+1]) continue;
if(i <= r) DP[0][i] = min(DP[0][p-(i-p)], r-i-1);
lef_t = i-DP[0][i];
righ_t = i+DP[0][i]+1;
DP[0][i]+=Expand(lef_t, righ_t);
if(DP[0][i]+i+1>r)
{
p = i;
r = i+DP[0][i]+1;
}
sol += (long long) DP[0][i];
}
}
void Print()
{
g<<sol<<'\n';
}
int main()
{
Read();
SolveOdd();
SolveEven();
Print();
return 0;
}