Pagini recente » Cod sursa (job #2824635) | Cod sursa (job #1414430) | Cod sursa (job #2387859) | Cod sursa (job #1404582) | Cod sursa (job #2471393)
#include <fstream>
using namespace std;
int a[100005], v[100005];
ifstream cin("prefix.in");
ofstream cout("prefix.out");
int main()
{
int n, r, m;
cin>>n;
for (int i = 1; i <= n; ++i)
{
cin>>a[i];
}
for (int i = 1; i < n; ++i)
a[i] = a[i+1] - a[i];
n -= 1;
int ans = 0;
for (int i = 1; i <= n; ++i)
{
if (i>r)
{
int k=1;
while (a[i+k] == a[i-k] && i+k <= n && i-k >= 1)
++k;
--k;
r = i + k;
m = i;
ans += k + 1;
v[i] = k;
}
//printf("%d %d", m, r);
else
{
int k = min(v[2 * m-i], r-i);
while (a[i + k] == a[i - k] && i + k <= n && i - k >= 1)
++k;
--k;
if (i + k > r)
{
r = i + k;
m = i;
}
ans += k + 1;
v[i] = k;
}
}
cout<<ans;
return 0;
}