Pagini recente » Cod sursa (job #1122016) | Cod sursa (job #513514) | Cod sursa (job #2448945) | Cod sursa (job #2257024) | Cod sursa (job #997070)
Cod sursa(job #997070)
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
const int Nmax = 1000005;
int N;
char sir[2 * Nmax], ch;
int P[2 * Nmax];
void read()
{
ifstream f("pscpld.in");
sir[ ++N ] = '#';
while ( true )
{
f.get( ch );
if ( ch == '\n' )
break;
sir[ ++N ] = ch;
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";
}
int main()
{
read();
Manacher();
return 0;
}