Pagini recente » Cod sursa (job #306965) | Cod sursa (job #1954502) | Cod sursa (job #2275986) | Cod sursa (job #1289653) | Cod sursa (job #2175117)
#include <iostream>
#include <fstream>
#define dimn 100005
std::ifstream f("numarare.in");
std::ofstream g("numarare.out");
int N;
int dif[2*dimn+1];
int mnch[2*dimn+1];
void manacher() {
int center = -1, right = -1;
for (int i=0; i<N; i++) {
if(i<=right) //ne aflam inauntrul unui pal
mnch[i] = std::min(right-i+1, mnch[center - (i-center)]);
while(i-mnch[i] >= 0 && i+mnch[i] < N && dif[i+mnch[i]+1] == dif[i-mnch[i]-1]) //expandarea
mnch[i]++;
if(i+mnch[i] > right)
center = i, right = i+mnch[i];
}
long long ans = 0;
for (int i=0; 2*i<N; i++)
ans += 1LL*mnch[2*i];
g << ans;
}
void citire() {
f >> N;
int y, x; f >> y;
dif[0] = 0;
for (int i=0; i<N; i++) {
f >> x;
dif[2*i+1] = y-x;
dif[2*i+2] = 0;
y = x;
} N = 2*N-1;
}
void rezolvare() {
manacher();
}
int main()
{
citire();
rezolvare();
return 0;
}