Pagini recente » Cod sursa (job #786791) | Cod sursa (job #644794) | Cod sursa (job #527918) | Cod sursa (job #273772) | Cod sursa (job #338906)
Cod sursa(job #338906)
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxn 2000010
long n, i, j, k, l, r, lung, poz, sol;
char s[maxn];
long v[maxn], t[maxn];
int main()
{
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
scanf("%s", s+1);
for(n=1; s[n]>0; ++n)
{
// printf("%c", s[n]);
}
--n;
for(i=1; i<=2*n-1; i++)
{
// printf("%d: ", i);
if(i%2)
{
l=r=i/2+1;
lung=1;
// printf("%d %d ", l, r);
if(t[i])
{
lung=v[2*t[i]-i];
// printf("%d ", lung);
poz=t[i]/2+1;
if(poz+v[t[i]]-1<i/2+1+lung-1)
{
lung=poz+v[t[i]]-1-(i/2+1)+1;
}
// printf("%d ", lung);
l-=(lung-1);
r+=(lung-1);
}
// printf("%d %d ", l, r);
while(s[l-1]==s[r+1] && l>1 && r<n)
{
l--;
r++;
lung++;
t[r*2]=t[r*2-1]=i;
}
sol+=lung;
v[i]=lung;
}
else
{
l=i/2+1;
r=l-1;
lung=0;
if(t[i])
{
lung=v[2*t[i]-i];
// printf("%d ", lung);
poz=t[i]/2+1;
if(poz+v[t[i]]-1<i/2+1+lung-1)
{
lung=poz+v[t[i]]-1-(i/2+1)+1;
}
// printf("%d ", lung);
l-=lung;
r+=lung;
}
// printf("%d %d ", l, r);
while(s[l-1]==s[r+1] && l>1 && r<n)
{
l--;
r++;
lung++;
t[r*2]=t[r*2-1]=i;
}
sol+=lung;
v[i]=lung;
}
// printf("%d\n", lung);
}
printf("%d\n", sol);
return 0;
}