Pagini recente » Cod sursa (job #690430) | Cod sursa (job #1802205) | Cod sursa (job #972075) | Borderou de evaluare (job #1811572) | Cod sursa (job #988720)
Cod sursa(job #988720)
#include<fstream>
#include<string>
#define mod 666013
using namespace std;
typedef unsigned int uni;
typedef struct celula{
uni val;
int nr;
celula *next;
}*lista;
lista h1[666013],h2[666013];
uni a[1050000];
int i,n,p1,p2,s,nr,l,u;
long long sol;
bool ok;
string st;
void baga1(uni x) {
int poz=x%mod; bool aux=1;
for (lista p=h1[poz]; p; p=p->next)
if (p->val==x) {
++p->nr; aux=0; if (p->nr==1) ok=0; break;
}
if (aux) { ok=0;
lista v=new celula; v->nr=1; v->val=x; v->next=h1[poz]; h1[poz]=v;
}
}
void baga2(uni x) {
int poz=x%mod; bool aux=1;
for (lista p=h2[poz]; p; p=p->next)
if (p->val==x) {
++p->nr; aux=0; if (p->nr==1) ok=0; break;
}
if (aux) { ok=0;
lista v=new celula; v->nr=1; v->val=x; v->next=h2[poz]; h2[poz]=v;
}
}
void scoate(uni x) {
int poz=x%mod;
for (lista p=h2[poz]; p; p=p->next)
if (p->val==x&&p->nr>1) {
--p->nr; break;
}
else if (p->val==x&&p->nr==1) { --p->nr; ok=0; break; }
for (lista p=h1[poz]; p; p=p->next)
if (p->val==x) { --p->nr; break; }
}
uni transforma(){
uni x=0;
while (st[s]!='\n') { x=x*10+uni(st[s])-48; ++s; }
++s;
return(x);
}
int main(void) {
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin>>n>>l>>u; getline(fin,st);
getline(fin,st,char(EOF)); st+='\n';
for (i=1; i<=n; ++i) a[i]=transforma();
// primul pas
for (i=1; nr<=u&&i<=n+1; ++i) {
ok=1; baga1(a[i]);
if (ok==0) ++nr;
if (p1==0) baga2(a[i]);
if (nr==l&&p1==0) p1=i;
}
//inaintez cu segvente bune
p2=i-1; s=1;
while (p1<=n) {
int v=p2-p1;
ok=1;
while (ok) {
sol+=v;
scoate(a[s]);
++s;
}
ok=1;
while (ok&&p1<=n) {
++p1; baga2(a[p1]);
}
ok=1;
if (a[s-1]!=a[p1]) while (ok&&p2<=n) {++p2; baga1(a[p2]); }
}
fout<<sol;
return(0);
}