Cod sursa(job #1345569)
Utilizator | Enache Adelina ade_tomi | Data | 17 februarie 2015 18:50:45 |
---|---|---|---|
Problema | PScPld | Scor | 60 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 0.93 kb |
#include<stdio.h>
int i,j,p[1000005*2],n,nr;
char s[1000004],c;
long long sol;
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
s[0]='#';
while(scanf("%c",&c)!=EOF)
{
if(c>='a'&&c<='z'){
nr++;
s[nr]=c;
nr++;
s[nr]='#';
}
}
n=nr;
for(i=1;i<n;i++)
{
if(j+p[j]<i)
{
while(s[i+p[i]+1]==s[i-p[i]-1]&&p[i]<i)
p[i]++;
}
else
{
if(i+p[2*j-i]<j+p[j])
{
p[i]=p[2*j-i];
}
else
{
p[i]=p[j]-i+j;
while(s[i+p[i]+1]==s[i-p[i]-1]&&p[i]<i)
p[i]++;
}
}
if(i+p[i]>j+p[j])
j=i;
sol+=(p[i]+1)/2;
}
printf("%lld",sol);
return 0;
}