Cod sursa(job #3206910)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 24 februarie 2024 13:51:32
Problema Numarare Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <fstream>
const int NMAX=200005;

using namespace std;
ifstream cin("numarare.in");
ofstream cout("numarare.out");

void manacher(int [], int [], int);

int s[NMAX];
int ans[NMAX], n;

signed main()
{
    int i;
    long long sum=0;
    cin>>n;
    for(i=0; i<n; i++) cin>>s[i];
    for(i=0; i<n-1; i++) s[i]=s[i+1]-s[i];
    manacher(ans, s, n);
    for(i=0; i<n-1; i++) sum+=ans[i]+1;
    cout<<sum<<'\n';
    return 0;
}

void manacher(int ans[], int s[], int n)
{
    int i;
    int dr=-1, st=-1;
    for(i=0; i<n; i++)
    {
        if(i>dr) ans[i]=1;
        else ans[i]=min(ans[dr+st-i], dr-i+1);
        while(true)
        {
            if(i-ans[i]<0 || i+ans[i]>=n) break;
            if(s[i+ans[i]]==s[i-ans[i]]) ans[i]++;
            else break;
        }
        ans[i]--;
        if(dr<=i+ans[i])
        {
            dr=i+ans[i];
            st=i-ans[i];
        }
    }
}