Pagini recente » Cod sursa (job #1411247) | Cod sursa (job #562635) | Cod sursa (job #1317616) | Cod sursa (job #2003425) | Cod sursa (job #2068994)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char cuv[2000010];
int lp[2000010];
int centru=2,dr=1,lgmax,contor,lg,og,dif;
long long suma=1;
void citire()
{
cin.getline(cuv,1000005);
lg=strlen(cuv);
contor=lg;
lg=2*lg+1;
}
void cel_mai_lung()
{
lp[1]=1;
if(lg==0)
return;
for(int i=2; i<lg; i++)
{
og=2*centru-i;
dif=dr-i;
if(dif>0)
lp[i]=min(lp[og],dif);
while ( ((i + lp[i]) < lg && (i - lp[i]) > 0) && ( ((i + lp[i] + 1) % 2 == 0) || (cuv[(i + lp[i] + 1)/2] == cuv[(i - lp[i] - 1)/2] )))
lp[i]++;
if (i+lp[i]>dr)
{
centru=i;
dr=i+lp[i];
}
if(i%2==0)
suma+=(lp[i])/2;
else
suma+=(lp[i]+1)/2;
}
}
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
citire();
cel_mai_lung();
cout<<suma;
return 0;
}