Pagini recente » Cod sursa (job #3128694) | Cod sursa (job #2683750) | Cod sursa (job #3331328) | Cod sursa (job #123100) | Cod sursa (job #988685)
Cod sursa(job #988685)
#include<fstream>
#include<string>
#define mod 9001
using namespace std;
typedef unsigned int uni;
typedef struct celula{
uni val,nr;
celula *next;
}*lista;
lista h1[9001],h2[9001];
uni x,nr,l,u,p1,p2,s,i,n,a[1050000];
long long sol;
bool ok;
string st;
void baga1(uni x) {
uni 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) {
uni 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) {
uni 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) {
long long 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;
while (ok&&p2<=n) {++p2; baga1(a[p2]); }
}
fout<<sol;
return(0);
}