Pagini recente » Cod sursa (job #1275002) | Cod sursa (job #2794057) | Cod sursa (job #1543789) | Cod sursa (job #2562484) | Cod sursa (job #1969908)
/**
* 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));
}