Cod sursa(job #2191302)

Utilizator Anastasia11Susciuc Anastasia Anastasia11 Data 2 aprilie 2018 14:35:15
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <fstream>
#define Nmax 100005

using namespace std;

ifstream f("numarare.in");
ofstream g("numarare.out");

int n, a[Nmax], man[2*Nmax];
int dif[Nmax];
long long ans;

void read()
{
    f >> n;
     for ( int i = 1 ; i <= n ; i ++ )
       f >> a[i];
}

void build()
{
    for ( int i = 2 ; i <= n ; i ++ )
       dif[i-1]=a[i-1]-a[i];
}

void manachers()
{
    int mid=0, rgt=0;
     for ( int i = 1 ; i < n ; i ++ )
     {
         if ( i <= rgt )
            man[i]=min(rgt-i+1, man[2*mid-i]);

         while ( (dif[i+man[i]]==dif[i-man[i]]) && (i-man[i]>0) && (i+man[i]<=n) )
            man[i]++;

         if ( i+man[i] >= rgt )
          {
              mid=i;
              rgt=i+man[i]-1;
          }
     }
}

void solve()
{
    for ( int i = 1 ; i <= n ; i ++ )
     ans+=man[i];
     g << ans;
}

int main()
{
    read();
    build();
    manachers();
    solve();
    return 0;
}