Pagini recente » Cod sursa (job #3279852) | Cod sursa (job #3031645) | Istoria paginii utilizator/consti.001 | Cod sursa (job #137330) | Cod sursa (job #483006)
Cod sursa(job #483006)
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <vector>
using namespace std;
long long fastFindPalindrome(const string &seq)
{
int seqLen = seq.length();
vector<int> l;
int i = 0;
int palLen = 0;
while ( i < seqLen )
{
if ( i > palLen && seq[i - palLen - 1] == seq[i] )
{
palLen += 2;
++i;
continue;
}
l.push_back(palLen);
int s = l.size() - 2;
int e = s - palLen;
bool ok = true;
for ( int j = s; j > e; --j )
{
int d = j - e - 1;
if ( l[j] == d )
{
palLen = d;
ok = false;
break;
}
l.push_back(min(d, l[j]));
}
if ( ok )
{
palLen = 1;
++i;
}
}
l.push_back(palLen);
int lLen = l.size();
int s = lLen - 2;
int e = s - (2 * seqLen + 1 - lLen);
for ( int i = s; i > e; --i )
{
int d = i - e - 1;
l.push_back(min(d, l[i]));
}
long long ret = 0;
for ( int i = 0; i < l.size(); ++i )
ret = ret + (long long)((l[i] >> 1) + (l[i] & 1));
return ret;
}
int main()
{
string str;
ifstream in("pscpld.in");
in >> str;
in.close();
ofstream out ("pscpld.out");
out << fastFindPalindrome(str);
out.close();
return 0;
}