Pagini recente » Profil OlaruVlad | Istoria paginii runda/f11-fast-competition | Diferente pentru preoni-2007/runda-finala/solutii intre reviziile 24 si 23 | Istoria paginii runda/concurs_test2/clasament | Cod sursa (job #997072)
Cod sursa(job #997072)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int Nmax = 1000005;
int N;
char s[Nmax], sir[2 * Nmax];
int P[2 * Nmax];
void read()
{
ifstream f("pscpld.in");
f.getline( s, Nmax );
int l = strlen ( s );
sir[ ++N ] = '#';
for ( int i = 0; i < l; ++i )
{
sir[ ++N ] = s[i];
sir[ ++N ] = '#';
}
f.close();
}
void Manacher()
{
ofstream g("pscpld.out");
int mx = 0, ind = 0;
long long sol = 0;
for ( int i = 1; i <= N; ++i )
{
if ( mx >= i )
{
P[i] = min( mx - i, P[2 * ind - i] );
}
while ( i - P[i] - 1 >= 0 && i + P[i] + 1 <= N &&
sir[i - P[i] - 1] == sir[i + P[i] + 1]
)
P[i]++;
if ( i + P[i] > mx )
{
mx = i + P[i];
ind = i;
}
}
for ( int i = 1; i <= N; ++i )
sol += ( P[i] + 1 ) / 2;
g << sol << "\n";
g.close();
}
int main()
{
read();
Manacher();
return 0;
}