Pagini recente » Cod sursa (job #1694271) | Cod sursa (job #1242718) | Cod sursa (job #2693900) | Cod sursa (job #1994893) | Cod sursa (job #587930)
Cod sursa(job #587930)
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn = 1000005;
using namespace std;
char s[maxn];
char sir[2 * maxn];
int i , j , n , cnt , lung[maxn] , st , dr , lf , rt;
long long ans;
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
fgets( s , maxn , stdin );
n = strlen(s) - 1;
for ( i = 0 ; i < n ; ++i )
sir[++cnt] = s[i] ,
sir[++cnt] = ' ';
for( i = 1 ; i <= 2 * n - 1 ; ++i ) {
if ( i & 1 )
st = i - 2 * lung[i] , dr = i + 2 * lung[i];
else
st = i - 1 - 2 * lung[i] , dr = i + 1 + 2 * lung[i];
for(lf = st , rt = dr ; lf > 0 && rt <= 2 * n - 1 ; ) {
if ( sir[lf] == sir[rt] )
lf -= 2 , rt += 2 , lung[i]++;
else
break;
}
rt -= 2;
for ( ; dr <= rt ; ++dr , --st)
lung[dr] = min( lung[st] , rt - dr + 1);
ans += lung[i];
}
printf("%lld\n",ans);
return 0;
}