Pagini recente » Cod sursa (job #419212) | Cod sursa (job #961845) | Cod sursa (job #1607024) | Cod sursa (job #839468) | Cod sursa (job #478814)
Cod sursa(job #478814)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const char iname[]="pscpld.in";
const char oname[]="pscpld.out";
const int maxn=2000005;
char a[maxn],s[maxn];
int l[maxn],x,y,i,n;
long long rez;
int main()
{
freopen(iname,"r",stdin);
freopen(oname,"w",stdout);
fgets(a,sizeof(a),stdin);
for(i=0;a[i]&&a[i]!='\n';++i)
s[++n]=a[i],s[++n]='*';
s[n--]=0;
l[1]=0;
rez=1;
x=y=1;
for(i=2;i<=n;++i)
{
if(i<=y)
{
l[i]=min(l[y-i+x],y-i);
if(l[i]+i==y)
{
x=i-l[i];
while(x>1&&y<n&&s[x-1]==s[y+1])
--x,++y,++l[i];
}
}
else
{
x=y=i;
l[i]=0;
while(x>1&&y<n&&s[x-1]==s[y+1])
++l[i],--x,++y;
}
if(i&1)
rez+=(l[i]+2)/2;
else
rez+=(l[i]+1)/2;
}
printf("%lld\n",rez);
}