Cod sursa(job #3206905)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 24 februarie 2024 13:41:06
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <fstream>
const int NMAX=2000005;

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

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

int s[NMAX], t[2*NMAX];
int ans[2*NMAX], n;

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

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