Pagini recente » Cod sursa (job #39684) | Cod sursa (job #2946983) | Cod sursa (job #1073406) | Cod sursa (job #1387488) | Cod sursa (job #248765)
Cod sursa(job #248765)
#include<stdio.h>
#include<string.h>
#define r 777124
#define N 15000000
char s[N];
struct nod{
int info;
int nrap;
nod *adr;
} *h[r];
int v[r],n,l,u,m;
int cifra(char x){
if(x=='0'||x=='1'||x=='2'||x=='3'||x=='4'||x=='5'||x=='6'||x=='7'||x=='8'||x=='9')
return 1;
return 0;
}
int aparitie(int x){
int rest=x%r;
if(x==h[rest]->info)
if(h[rest]->nrap==1){
nod *aux=h[rest];
h[rest]=h[rest]->adr;
delete aux;
return 0;
}
else
return --h[rest]->nrap;
for(nod *p=h[rest];p->adr!=NULL;p=p->adr)
if(p->adr->info==x)
if(p->adr->nrap!=1)
return --p->adr->nrap;
else{
nod *aux=p->adr;
p->adr=aux->adr;
delete aux;
return 0;
}
return 1;
}
void scot(int &j){
while(aparitie(v[j]))
++j;
++j;
}
void citire(){
int m=0,y,x,i;
scanf("%d%d%d\n",&n,&l,&u);
y=n;
while(y--){
gets(s);
x=0;
for(i=0;s[i];++i)
if(cifra(s[i]))
x=x*10+(s[i]-'0');
v[++m]=x;
}
/*for(i=1;i<=m;++i)
printf("%d ",v[i]);
printf("\n");*/
}
bool diferit(int x){
int rest=x%r;
nod *p=h[rest];
while(p!=NULL){
if(p->info==x){
++p->nrap;
return false;
}
p=p->adr;
}
p=new nod;
p->adr=h[rest];
p->info=x;
p->nrap=1;
h[rest]=p;
return true;
}
void scrie_h()
{
for(int i=0;i<r;++i)
if(h[i])
{
for(nod*p=h[i] ; p ; p=p->adr)
printf("(%d,%d) ",p->info,p->nrap);
printf("\n");
}
printf("\n****\n");
}
long long secvente(int w){
long long nrs=0;
int i,j,nrd;
for(i=1,j=1,nrd=0;i<=n;++i){
if(diferit(v[i])){
if(++nrd==w+1){
scot(j);
--nrd;
}
}
nrs+=i-j+1;
//scrie_h();
}
//printf("rez=%lld\n\n",nrs);
return nrs;
}
void sterg(nod* &p)
{
nod*aux;
while(p)
{
aux=p;
p=p->adr;
delete aux;
}
}
void reset(){
for(int i=0;i<r;++i)
if(h[i])
sterg(h[i]);
}
int main(){
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
citire();
long long x,y;
x=secvente(u);
reset();
y=secvente(l-1);
printf("%lld\n",x-y);
fclose(stdin);
fclose(stdout);
return 0;
}