Pagini recente » Cod sursa (job #1120370) | Cod sursa (job #2750159) | Cod sursa (job #2942304) | Cod sursa (job #2049765) | Cod sursa (job #1126851)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int Nmax = 1000004;
char sir[Nmax];
char S[2 * Nmax];
int P[2 * Nmax];
int N;
int main()
{
ifstream f("pscpld.in");
ofstream g("pscpld.out");
f >> sir;
N = strlen( sir );
int NN = 0;
S[ ++NN ] = '#';
for ( int i = 0; i < N; ++i )
{
S[ ++NN ] = sir[i];
S[ ++NN ] = '#';
}
int mx = 0, idx = 0;
for ( int i = 1; i <= NN; ++i )
{
if ( mx >= i )
P[i] = min( mx - i, P[2 * idx - i] );
while ( i - P[i] - 1 >= 0 && i + P[i] + 1 <= NN && S[i - P[i] - 1] == S[i + P[i] + 1] )
P[i]++;
if ( P[i] + i >= mx )
{
mx = P[i] + i;
idx = i;
}
}
long long nr = 0;
for ( int i = 1; i <= NN; ++i )
nr += ( P[i] + 1 ) / 2LL;
g << nr << "\n";
}