Pagini recente » Cod sursa (job #3033422) | Cod sursa (job #320446) | Cod sursa (job #2635646) | Cod sursa (job #1358403) | Cod sursa (job #1722401)
#include <cstdio>
#include <algorithm>
const int SIZE = 2e6 + 5;
using namespace std;
char S1[SIZE], S[SIZE];
int N, left, right, middle, position, L[SIZE];
long long answer;
int main() {
freopen( "pscpld.in" , "r", stdin );
freopen( "pscpld.out", "w", stdout );
scanf( "%s", S1 + 1 );
for( int i = 1; S1[i] != 0; i ++ ) {
S[++N] = '&';
S[++N] = S1[i];
}
S[++N] = '&';
for( int i = 1; i <= N; i ++ ) {
if( i > right ) {
left = right = middle = i; L[i] = 1;
while( left > 1 && right < N && S[left - 1] == S[right + 1] ) {
L[i] ++;
left --; right ++;
}
} else {
position = middle - (i - middle);
if( position - (L[position] - 1) == left ) {
L[i] = L[position]; middle = i;
left = i - (right - i);
while( left > 1 && right < N && S[left - 1] == S[right + 1] ) {
L[i] ++;
left --; right ++;
}
} else
L[i] = min( L[position], right - i + 1 );
}
answer += L[i] / 2;
}
printf( "%lld\n", answer );
return 0;
}