Cod sursa(job #101208)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 13 noiembrie 2007 09:14:37
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 2.23 kb
# include <stdio.h>
# include <string.h>

const long int MAXLT=10000000; //10 000 000
const long int MAXLC=20;
const long int MAXNC=50000; //50 000

char text[MAXLT+10];

long long int heap[MAXNC+1];
long long int v[MAXNC+1];
long long int sol;
long int heaplen,leng,n;

//heap handlers

void rise_heap(long int i)
{
long long int aux;
while (i/2&&heap[i/2]>heap[i])
	{
	aux=heap[i/2];
	heap[i/2]=heap[i];
	heap[i]=aux;
	i/=2;
	}
}

long int submerge_heap(long int i)
{
long long int aux;long int min;
do
	{
	min=i;
	if (2*i<=heaplen&&heap[min]>heap[2*i]) min=2*i;
	if (2*i+1<=heaplen&&heap[min]>heap[2*i+1]) min=2*i+1;
	if (min==i) return 0;
	aux=heap[i];heap[i]=heap[min];heap[min]=aux;
	i=min;
	}
while (1);
}

void insert_heap(long long int a)
{
heap[++heaplen]=a;
rise_heap(heaplen);
}

long long int extract_heap()
{
long long int sol=heap[1];
heap[1]=heap[heaplen];
heap[heaplen]=0;
heaplen--;
submerge_heap(1);
return sol;
}

long long int convert(char *p)
{
long int l=0;
long long int sol=0;
while (p[l]!='\n')
	{
	sol=sol*3+(int)p[l]-(int)'a';
	l++;
	}
if (leng==0) leng=l;
return sol;
}


void citire()
{
FILE *f=fopen("abc2.in","r");
fgets(text,MAXLT+10,f);
char cuv[MAXLC+10];
char *t;
do
	{
	t=fgets(cuv,MAXLC+20,f);
	if (t!=NULL)
		insert_heap(convert(cuv));
	}
while (t!=NULL);
fcloseall();
}

void scrie()
{
FILE *g=fopen("abc2.out","w");
fprintf(g,"%lld\n",sol);
fcloseall();
}

void melt_heap_into_vector()
{
n=0;long long int aux;
while (heaplen)
	{
	aux=extract_heap();
	if (n==0||v[n]!=aux)
		{
		v[++n]=aux;
		//count[n]=1;
		}
//	else
//		{
//		count[n]++;
//		}
	}
}

long int search(long long int a)
{
long int li=1,lf=n,m;
while (li<=lf)
	{
	m=(li+lf)/2;
	if (v[m]==a) return 1;
	if (v[m]<a) li=m+1;
	else lf=m-1;
	}
return 0;
}

void calculeaza()
{
long long int nr=0,p3;
char *p;p=text;
while (p-text+1<=leng)
	{
	nr=nr*3+(int)(*p)-(int)'a';
	if (p==text) p3=1;
	else p3*=3;
	p++;
	}
sol+=search(nr);
//p3/=3;
while ((*p)!='\n')
	{
	while (nr>=p3) nr-=p3;
	nr=nr*3+(int)(*p)-(int)'a';
	sol+=search(nr);
	p++;
	}
}

int main()
{
citire();
melt_heap_into_vector();
calculeaza();
scrie();
return 0;
}