Pagini recente » Cod sursa (job #2038315) | Cod sursa (job #572784) | Cod sursa (job #2704050) | Cod sursa (job #1869005) | Cod sursa (job #2595850)
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
char s[1000002],p[2000002];
int n,manacher[2000002];
void Manacher()
{
int i,st,dr,poz=0,l=0,ll;
p[1]='*';
for(i=1;i<=n;i++)
{
p[i*2]=s[i];
p[i*2+1]='*';
}
for(i=1;i<=2*n+1;i++)
{
if(i>poz+l)
{
poz=i;
l=0;
st=i-1;
dr=i+1;
while(st>=1&&dr<=2*n+1&&p[st]==p[dr])
{
st--;
dr++;
l++;
}
manacher[i]=l;
}
else
{
if(i+manacher[2*poz-i]<poz+l)
manacher[i]=manacher[2*poz-i];
else
if(i+manacher[2*poz-i]>poz+l)
manacher[i]=poz+l-i;
else
{
st=i-manacher[2*poz-i]-1;
dr=poz+l+1;
ll=0;
while(st>=1&&dr<=2*n+1&&p[st]==p[dr])
{
st--;
dr++;
ll++;
}
manacher[i]=poz+l-i;
if(ll!=0)
{
manacher[i]+=ll;
poz=i;
l=manacher[i];
}
}
}
}
}
int main()
{
int i;
long long sol=0;
f.getline(s+1,1000001);
n=strlen(s+1);
Manacher();
for(i=1;i<=2*n+1;i++)
{
if(p[i]=='*')
sol+=manacher[i]/2;
else
sol+=manacher[i]/2+1;
}
g<<sol;
return 0;
}