Cod sursa(job #100392)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 12 noiembrie 2007 09:56:14
Problema Abc2 Scor 0
Compilator cpp Status done
Runda Happy Coding 2007 Marime 1.52 kb
#include<stdio.h>
#include<string.h>
char txt[1000100],cuv[25],*p,*q;
long long int dic[50002],treila[20],aux,nrc;
long int lt,lc,ld,cont,i,ldr;
long long int cton(char *pp);
void swap(long int i1,long int i2);
void heapdown(long int ic,long int nc);
long int cbin(long int L,long int R);
int main()
{
	FILE *f,*g;f=fopen("abc2.in","r");g=fopen("abc2.out","w");
	fscanf(f,"%s",txt);lt=strlen(txt);
	fscanf(f,"%s",cuv);lc=strlen(cuv);
	treila[0]=1;
	for(i=1;i<lc;i++) treila[i]=3*treila[i-1];
	ld=1;dic[ld]=cton(cuv);
	while(fscanf(f,"%s",cuv)!=EOF)
	{  ld++;dic[ld]=cton(cuv);
	}
	for(i=ld/2;i>=1;i--) heapdown(i,ld);
	for(i=ld;i>=1;i--){swap(1,i);heapdown(1,i-1);}
	ldr=1;
	for(i=2;i<=ld;i++)
	 if(dic[i]!=dic[i-1]){ldr++;dic[ldr]=dic[i];}
	nrc=cton(txt);
	for(i=lc;i<lt;i++)
	{
	   cont+=cbin(1,ldr);
	   nrc/=3;nrc+=(long long int)(txt[i]-'a')*treila[lc-1];
	}
	fprintf(g,"%ld\n",cont);
	fcloseall();
	return 0;
}
long long int cton(char *pp)
{
	long long int ret=0;
	for(i=0;i<lc;i++)
	ret+=(long long int)(pp[i]-'a')*treila[i];
	return ret;
}
void swap(long int i1,long int i2)
{
	aux=dic[i1];dic[i1]=dic[i2];dic[i2]=aux;
}
void heapdown(long int ic,long int nc)
{
	long int is,is1;
	is=2*ic;is1=2*ic+1;
	if(is>nc)return;
	if(is<nc)if(dic[is]<dic[is1])is=is1;
	if(dic[ic]<dic[is]){swap(ic,is);heapdown(is,nc);}
}
long int cbin(long int L,long int R)
{
	long int M;
	if(nrc<dic[L])return 0;
	if(nrc>dic[R])return 0;
	M=(L+R)/2;
	if(nrc==dic[M])return 1;
	return cbin(L,M-1)+cbin(M+1,R);
}