Pagini recente » Cod sursa (job #1060094) | Cod sursa (job #227601) | Cod sursa (job #1962455) | Cod sursa (job #2564481) | Cod sursa (job #1208818)
#include <fstream>
#include <vector>
using namespace std;
#define UI unsigned int
#define NMAX ((1<<20)+1)
#define MOD 666013
UI N,positions,i,lft,rght,diferite,start,finish,limita;
UI A[NMAX],nxt[NMAX];
vector < UI > H[MOD];
bool is;
long long total;
UI function(UI step)
{
if (step==N)
{
nxt[step]=N;
return N;
}
if (A[step+1]!=A[step])
{
nxt[step]=step+1;
return nxt[step];
}
++positions;
nxt[step]=function(step+1);
}
bool find(int X)
{
int j;
for (j=0;j<H[X%MOD].size();++j)
if (H[X%MOD][j]==X)
return true;
return false;
}
int main()
{
ifstream f("secv5.in");
ofstream g("secv5.out");
f>>N>>lft>>rght;
for (i=1;i<=N;++i)
f>>A[i];
for (i=1;i<N;)
{
if (A[i+1]!=A[i])
{
nxt[i]=i+1;
++i;
continue;
}
positions=1;
nxt[i]=function(i+1);
i+=positions;
}
nxt[N]=N;
i=1;
while (diferite<lft && i<=N)
{
is=find(A[i]);
if (!is)
{
++diferite;
H[A[i]%MOD].push_back(A[i]);
}
++i;
}
start=i;
for (i=0;i<MOD;++i)
H[i].clear();
i=1;
diferite=0;
while (diferite<rght && i<=N)
{
is=find(A[i]);
if (!is)
{
++diferite;
H[A[i]%MOD].push_back(A[i]);
}
++i;
}
finish=i;
for (i=0;i<MOD;++i)
H[i].clear();
i=N;
diferite=0;
while (diferite<lft && i>=1)
{
is=find(A[i]);
if (!is)
{
++diferite;
H[A[i]%MOD].push_back(A[i]);
}
--i;
}
limita=i+1;
--start;
total=finish-start+1;
for (i=2;i<=limita;++i)
{
if (A[i]==A[i-1])
{
total+=finish-start+1;
continue;
}
start=nxt[start];
finish=nxt[finish];
total+=1LL*(finish-start+1);
}
g<<total<<'\n';
return 0;
}