Cod sursa(job #483006)

Utilizator DastasIonescu Vlad Dastas Data 6 septembrie 2010 15:19:40
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#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;
}