Pagini recente » Cod sursa (job #662993) | Cod sursa (job #2034074) | Cod sursa (job #2211065) | Cod sursa (job #2050675) | Cod sursa (job #2457058)
#include <bits/stdc++.h>
#define maxim 100005
using namespace std;
ifstream f("numarare.in");
ofstream g("numarare.out");
long long make_man (int (&s)[maxim], int n)
{
int r = 0, c = 0;
long long ans = 0;
int z[maxim];
z[0] = 0;
for (int i = 1; i <= n; ++ i)
{
int op = 2 * c - i + 1;
if (i > r || z[op] >= r - i)
{
if (i > r)
r = i;
int k = r + 1;
int sum = s[k] + s[2 * i - k + 1];
while (k <= n && (2 * i - k + 1 >= 1) && s[k] + s[2 * i - k + 1] == sum)
k ++;
k --;
z[i] = k - i;
if (k > r)
{
c = i;
r = k;
}
}
else
z[i] = z[op];
ans += z[i];
}
return ans;
}
int main()
{
int n;
int s[maxim];
f >> n;
assert(n < maxim);
for (int i = 1; i <= n; ++ i)
f >> s[i];
g << make_man(s, n);
}