Pagini recente » Cod sursa (job #1770987) | Cod sursa (job #1406038) | Cod sursa (job #318574) | Cod sursa (job #2138460) | Cod sursa (job #101208)
Cod sursa(job #101208)
# 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;
}