Pagini recente » Cod sursa (job #2213042) | Cod sursa (job #491097) | Cod sursa (job #2098009) | Cod sursa (job #1583230) | Cod sursa (job #2510011)
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
FILE *f,*g;
char s[2000004],t[1000004];
int n,lps[2000004];
long long sol;
void read()
{ int lg;
fscanf(f,"%s",&t);
lg=strlen(t);
s[0]='#';
for(int i=0;i<lg;i++)
{
s[++n]=t[i];
s[++n]='#';
}
sol=lg;
}
void solve()
{
int r=1,c=1,ii,expand;
lps[1]=1;
lps[0]=0;
for(int i=2;i<=n;i++)
{
ii=2*c-i;
expand=0;
if(r<=i)
{
lps[i]=0;
expand=1;
}
else
{
if(lps[ii]<r-i)
lps[i]=lps[ii];
else
{
lps[i]=min(r-i,lps[ii]);
expand=1;
}
}
if(expand)
{
while(i-lps[i]>0 && i+lps[i]<n)
{
if((i-lps[i]-1)%2==0)
lps[i]++;
else
{
if(s[i-lps[i]-1]==s[i+lps[i]+1])
lps[i]++;
else
break;
}
}
}
if(r<i+lps[i])
{
r=i+lps[i];
c=i;
}
sol+=1ll*lps[i]/2;
}
}
void write()
{
fprintf(g,"%lld",sol);
}
int main()
{
f=fopen("pscpld.in","r");
g=fopen("pscpld.out","w");
read();
solve();
write();
fclose(f);
fclose(g);
return 0;
}