Pagini recente » Cod sursa (job #43525) | Cod sursa (job #2355930) | Cod sursa (job #3269166) | Cod sursa (job #1560278) | Cod sursa (job #466615)
Cod sursa(job #466615)
#include <fstream>
using namespace std;
const int MAX_N = 200005;
ifstream fin ("numarare.in");
ofstream fout ("numarare.out");
int N, V[MAX_N], L[MAX_N], S[MAX_N], bst = 1;
long long Sol;
void citire() {
fin >> N;
// Sol = N-1;
for(int i = 1; i <= N; ++i) {
fin >> V[i];
}
for(int i = 2; i <= N; ++i) {
S[2*i-3] = V[i] - V[i-1];
}
--N;
N *= 2;
}
void solve() {
for(int i = 1; i < N; ++i) {
if(bst + L[bst] - 1 < i) {
L[i] = (i & 1);
} else {
L[i] = min(L[2 * bst - i], bst + L[bst] - i);
}
int j = L[i] + 1;
while(i - j > 0 && i + j <= N && S[i + j] == S[i - j]) {
j += 2;
}
L[i] = j - 1;
if(i + L[i] > bst + L[bst]) {
bst = i;
}
if((i & 1) == 1) {
Sol += (L[i] + 1) >> 1;
}
}
/* for(int i = 1; i <= N; ++i)
fout << S[i] << " ";
fout << "\n";
for(int i = 1; i <= N; ++i)
fout << L[i] << " ";
*/
fout << Sol;
}
int main() {
citire();
solve();
}