Cod sursa(job #1969908)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 18 aprilie 2017 18:39:29
Problema Numarare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
/**
  *  Worg
  */
#include <cstdio>
#include <vector>

FILE *fin = freopen("numarare.in", "r", stdin);
FILE *fout = freopen("numarare.out", "w", stdout);

/*-------- Input Data --------*/
int N;
std::vector<int > s, diff;
/*-------- Manacher data --------*/
std::vector<int > manacher;
/*-------- --------*/

void ReadInput() {
	scanf("%d", &N);
	s.resize(N);
	for(int i = 0; i < N; i++) {
		scanf("%d", &s[i]);
	}

	diff.resize(--N);
	for(int i = 0; i < N; i++) {
		diff[i] = s[i + 1] - s[i];
	}
}

long long GetPalindromicSequences(const std::vector<int > &v, const int N) {
    manacher.resize(N);
    long long answer = 0;
    int center = -1, index = -1;
    for(int i = 0; i < N; i++) {
		if(i <= index) {
			manacher[i] = std::min(index - i + 1, manacher[center - (i - center)]);
		}
		while(i - manacher[i] >= 0 && i + manacher[i] < N && v[i - manacher[i]] == v[i + manacher[i]]) {
			manacher[i] ++;
		}
		answer += manacher[i];
        if(i + manacher[i] - 1 > index) {
			index = i + manacher[i] - 1;
			center = i;
        }
    }

    return answer;
}

int main() {
	ReadInput();
	printf("%lld\n", GetPalindromicSequences(diff, N));
}