Pagini recente » Cod sursa (job #479386) | Cod sursa (job #467747)
Cod sursa(job #467747)
#include <stdio.h>
#define NMAX 1000005
#define MOD 9901
#define LMAX 2000005
#define ll long long
char A[NMAX],B[LMAX];
int n,r,st,dr,left[LMAX],right[LMAX],nr[LMAX];
ll rez;
inline int lit(char x)
{
return x>='a' && x<='z';
}
void read()
{
fgets(A+1,NMAX,stdin);
while (lit(A[n+1])) n++;
int i;
for (i=1; i<n; i++)
{
B[++r]=A[i];
nr[r]=nr[r-1];
B[++r]='a';
nr[r]=nr[r-1]+1;
}
B[++r]=A[n];
nr[r]=nr[r-1];
n=r;
}
void solve()
{
int i,a,b,c;
for (i=1; i<=n; i++)
if (i>dr)
{
a=b=i;
while (B[a-1]==B[b+1] && a-1>=1 && b+1<=n)
a--,b++;
rez+=(i-a+1)-(nr[i]-nr[a-1]);
st=a; dr=b;
left[i]=st; right[i]=dr;
}
else
{
a=st+(dr-i);
b=left[a]; c=right[a];
if (b>st)
{
left[i]=i-(a-b);
right[i]=i+(a-b);
rez+=(i-left[i]+1)-(nr[i]-nr[left[i]-1]);
}
else
{
a=i-(dr-i); b=dr;
while (B[a-1]==B[b+1] && a-1>=1 && b+1<=n)
a--,b++;
rez+=(i-a+1)-(nr[i]-nr[a-1]);
st=a; dr=b;
left[i]=a; right[i]=b;
}
}
}
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
read();
solve();
printf("%lld\n",rez);
return 0;
}