Pagini recente » Cod sursa (job #2950245) | Cod sursa (job #3250964) | Cod sursa (job #2931344) | Cod sursa (job #1597192) | Cod sursa (job #934497)
Cod sursa(job #934497)
#include<stdio.h>
#include<cstring>
#define maxn 1000005
FILE*f=fopen("pscpld.in","r");
FILE*g=fopen("pscpld.out","w");
int n;
int lung[maxn<<1];
char sir[maxn];
inline int min ( const int &a , const int &b ){
return a <= b ? a : b;
}
int main () {
fscanf(f,"%s",sir+1); n = strlen(sir+1);
int st = 0,dr = 0;
for ( int i = 1 ; i <= n+n-1 ; ++i ){
int x = (i+1)>>1;
if ( x+!(i&1) > dr ){
int p = x,u = x+!(i&1);
while ( p > 0 && u <= n && sir[p] == sir[u] ){
--p; ++u; ++lung[i];
}
++p; --u; st = p; dr = u;
}
else{
lung[i] = min(lung[i-(dr-st+1)-2*((dr-st+1)&1)],dr-x-!(i&1));
int p = x-lung[i],u = x+lung[i]+!(i&1);
while ( p > 0 && u <= n && sir[p] == sir[u] ){
--p; ++u; ++lung[i];
}
++p; --u;
if ( u > dr ){
st = p,dr = u;
}
}
}
long long sol = 0;
for ( int i = 1 ; i <= n+n-1 ; ++i ){
sol += lung[i];
}
fprintf(g,"%lld\n",sol);
fclose(f);
fclose(g);
return 0;
}