Pagini recente » Cod sursa (job #1211457) | Cod sursa (job #899708) | Cod sursa (job #1788904) | Cod sursa (job #1547031) | Cod sursa (job #338957)
Cod sursa(job #338957)
#include <stdio.h>
#include <string.h>
using namespace std;
#define maxn 2000010
long n, i, j, k, l, r, lung, poz, sol, x, v[maxn], t[maxn], op, l1, o2, uac, p, sp1, sp2;
char s[maxn];
void verif(long tip)
{
if(t[i])
{
lung=v[2*t[i]-i];
poz=t[i]/2+1;
if(poz+v[t[i]]<x+lung)
{
lung=poz+v[t[i]]-x;
}
l-=(lung-tip);
r+=(lung-tip);
}
l1=lung;
sp2=r;
while(s[l-1]==s[r+1] && l>1 && r<n)
{
op++;
l--;
r++;
lung++;
// t[r*2]=t[r*2-1]=i;
if(l==1 || r==n) break;
}
for(; sp2<=r; sp2++)
{
sp1=t[sp2]/2-v[t[sp2]]+1;
if(l<sp1)
{
t[sp2*r]=t[sp2*r-1]=i;
}
}
sol+=lung;
v[i]=lung;
}
int main()
{
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
scanf("%s", s+1);
for(n=1; s[n]>0; ++n);
--n;
uac=1;
for(i=1; i<=2*n-1; i++)
{
// printf("%d: ", i);
if(i&1)
{
x=i/2+1;
l = r = x;
lung=1;
verif(1);
}
else
{
x=i/2+1;
l=x;
r=l-1;
lung=0;
verif(0);
}
p=uac;
// printf("%d ", r);
/* for(; uac<r*2; uac++)
{
t[uac]=i;
}*/
// printf("%d %d\n", lung, lung-l1);
o2+=lung-l1;
}
/* for(i=1; i<=n*2; i++)
{
// printf("%d ", t[i]);
}*/
// printf("\n%d %d\n", o2, n);
printf("%d\n", sol);
return 0;
}