Cod sursa(job #1524272)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 13 noiembrie 2015 19:18:45
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>

using namespace std;

const int NMAX = 100005;

int n;
int s[NMAX];

int ext[NMAX];

int main()
{
    ifstream cin("numarare.in");
    ofstream cout("numarare.out");

    cin >> n;
    for (int i = 1; i <= n; ++ i)
        cin >> s[i];

    int ans = 0, centru = 0;
    for (int i = 1, dif, sum; i < n; ++ i) {
        if (centru + ext[centru] < i)
            dif = 1;
        else if (2 * centru - i - ext[2 * centru - i] + 1 > centru - ext[centru] + 1) {
            ext[i] = ext[2 * centru - i];
            ans += ext[i];

            continue;
        }
        else
            dif = centru + ext[centru] - i;

        for (sum = s[i] + s[i + 1]; i - dif + 1 >= 1 && i + dif <= n && s[i - dif + 1] + s[i + dif] == sum; ++ dif);
        ext[i] = -- dif;

        ans += ext[i];

        if (i + ext[i] > centru + ext[centru])
            centru = i;
    }

    cout << ans << '\n';

    cin.close();
    cout.close();
    return 0;
}