Pagini recente » Cod sursa (job #953911) | Cod sursa (job #1321955) | Cod sursa (job #1769419) | Cod sursa (job #1414991) | Cod sursa (job #1316051)
#include<fstream>
#include<string>
using namespace std;
ifstream fin( "pscpld.in" );
ofstream fout( "pscpld.out" );
const int nmax = 2000001;
int d[ nmax + 1 ];
string s, aux;
void extend( int p ) {
while ( p - d[ p ] >= 0 && p + d[ p ] < ( int )s.size() && s[ p - d[ p ] ] == s[ p + d[ p ] ] ) {
++ d[ p ];
}
}
int main() {
int j;
fin >> aux;
for( string::iterator it = aux.begin(); it != aux.end(); ++ it ) {
s += "$";
s += *it;
}
s += "$";
aux.clear();
j = 0;
long long ans = 0;
for( int i = 0; i < ( int )s.size(); ++ i ) {
if ( i > j + d[ j ] ) {
extend( i );
j = i;
} else {
int k = 2 * j - i;
if ( k - d[ k ] > j - d[ j ] ) {
d[ i ] = d[ k ];
} else {
d[ i ] = k - (j - d[ j ]);
extend( i );
}
if ( i + d[ i ] > j + d[ j ] ) {
j = i;
}
}
ans += ( long long )d[ i ] / 2;
}
fout << ans << "\n";
fin.close();
fout.close();
return 0;
}