Cod sursa(job #248765)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 26 ianuarie 2009 19:42:12
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#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;
}