Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 7

#include<bits/stdc++.

h>
#include<stdio.h>

int strCmp(char x[],char y[])


{
int i=0;
while(1)
{
//printf("%d\n",i);
if(x[i]=='\0' && y[i]=='\0')
{
return 1;
}

else if(x[i]=='\0')
{
return 3;
}

else if(y[i]=='\0')
{
return 2;
}

else if(x[i]>y[i])
{
return 2;
}

else if(x[i]<y[i])
{
return 3;
}

i++;
}

void strCpy(char *x,char y[])


{
int i;

for(i=0;y[i]!='\0';i++)
{
*x=y[i];
x++;

*x='\0';

long long int strhash(char s[])


{
long long int sum=0;
long long int m=31541;//random prime number based on max array size and
collision
long long int p=1;

for(int i=0;i<s[i]!='\0';i++)
{
sum=(sum+ ((s[i]-'a'+1)*p) )%m;
p=(p*31)%m;//multiply number greater then the charecter set as well as the
nuber should be prime
}

return sum;
}

typedef struct book


{
int id;
char title[30];
char genre[30];
char author[30];
char language[30];
int year;
}book;

void srt(book x[],book z[],int s,int m,int e,int i,int j,int c)


{

// cout<<c<<" "<<i<<" "<<j<<endl;


if(c==e+1)return;

if(i==m-s+1)
{
x[c]=z[m+j+1];
j++;
c++;
}

else if(j==e-m)
{
x[c]=z[s+i];
i++;
c++;
}

else if( z[s+i].id <= z[m+j+1].id)


{
// printf("%d %d\n", b [z[s+i]].id , b [z[m+j+1]].id );
x[c]=z[s+i];
i++;
c++;
}

else
{
x[c]=z[m+j+1];
j++;
c++;

srt(x,z,s, m, e, i, j, c);

void mergesort(book x[],book z[],int s,int e)


{

if(s>=e)return;

//cout<<s<<" " <<e<<endl;

int m=(s+e)/2;
mergesort(x,z,s,m);
mergesort(x,z,m+1,e);

srt(x,z,s,m,e,0,0,s);

for(int k=s;k<=e;k=k+1)
{
z[k]=x[k];
}

int hasht[31544][51],hashg[31544][51],hasha[31544][51],hashl[31544]
[51],hashy[10005][51];// 51 because per queary max result can be 50
int cntg[31544],cntt[31544],cnta[31544],cntl[31544],cnty[10005];

int main()
{

int n,i;
scanf("%d",&n);

book x[n+5];
book z[n+5];

for(i=0;i<n;i=i+1)
{

scanf("%d%s%s%s%s
%d",&x[i].id,x[i].title,x[i].genre,x[i].author,x[i].language,&x[i].year);

z[i]=x[i];

int s=0;
int e=n-1;
mergesort(x,z,s,e);//sort the array

//set all count 0


memset(cntg,0,sizeof(cntg));
memset(cntt,0,sizeof(cntt));
memset(cnta,0,sizeof(cnta));
memset(cntl,0,sizeof(cntl));
memset(cnty,0,sizeof(cnty));

for(i=0;i<n;i=i+1)
{
long long int ht=strhash( x[i].title );
long long int hg=strhash( x[i].genre );
long long int ha=strhash( x[i].author );
long long int hl=strhash( x[i].language );
hasht[ht][cntt[ht]++]=i;
hashg[hg][cntg[hg]++]=i;
hasha[ha][cnta[ha]++]=i;
hashl[hl][cntl[hl]++]=i;
hashy[x[i].year][cnty[x[i].year]++]=i;

int q;
scanf("%d",&q);

int qx;

int num;
char gen[30];
char title[30];
char author[30];
char language[30];

while(q--)
{
int c=0;
scanf("%d",&qx);
if(qx==1)
{
scanf("%s",gen);

long long int get=strhash(gen);

for(i=0; i<cntg[get]; i=i+1)


{
printf("%d %s %s %s %s %d\n",x[ hashg[get][i] ].id,x[hashg[get]
[i]].title,x[hashg[get][i]].genre,x[hashg[get][i]].author,x[hashg[get]
[i]].language,x[hashg[get][i]].year);

else if(qx==2)
{
scanf("%d",&num);
long long int get=num;
for(i=0; i<cnty[get]; i=i+1)
{
printf("%d %s %s %s %s %d\n",x[ hashy[get][i] ].id,x[hashy[get]
[i]].title,x[hashy[get][i]].genre,x[hashy[get][i]].author,x[hashy[get]
[i]].language,x[hashy[get][i]].year);

else if(qx==3)
{
scanf("%s",title);
long long int get=strhash(title);

for(i=0; i<cntt[get]; i=i+1)


{
printf("%d %s %s %s %s %d\n",x[ hasht[get][i] ].id,x[hasht[get]
[i]].title,x[hasht[get][i]].genre,x[hasht[get][i]].author,x[hasht[get]
[i]].language,x[hasht[get][i]].year);

else if(qx==4)
{
scanf("%s",author);
long long int get=strhash(author);

for(i=0; i<cnta[get]; i=i+1)


{
printf("%d %s %s %s %s %d\n",x[ hasha[get][i] ].id,x[hasha[get]
[i]].title,x[hasha[get][i]].genre,x[hasha[get][i]].author,x[hasha[get]
[i]].language,x[hasha[get][i]].year);

}
}

else if(qx==5)
{
scanf("%s",language);
long long int get=strhash(language);

for(i=0; i<cntl[get]; i=i+1)


{
printf("%d %s %s %s %s %d\n",x[ hashl[get][i] ].id,x[hashl[get]
[i]].title,x[hashl[get][i]].genre,x[hashl[get][i]].author,x[hashl[get]
[i]].language,x[hashl[get][i]].year);

}
}

else if(qx==6)
{
scanf("%s%s",author,language);
long long int geta=strhash(author),getl=strhash(language);
for(i=0; i<cntl[getl]; i=i+1)
{
if(strhash(x[ hashl[getl][i] ].author )==geta)
{
printf("%d %s %s %s %s %d\n",x[ hashl[getl]
[i] ].id,x[hashl[getl][i]].title,x[hashl[getl][i]].genre,x[hashl[getl]
[i]].author,x[hashl[getl][i]].language,x[hashl[getl][i]].year);
}
}

else if(qx==7)
{
scanf("%s%s",author,title);
long long int geta=strhash(author),gett=strhash(title);

for(i=0; i<cntt[gett]; i=i+1)


{
if(strhash(x[ hasht[gett][i] ].author )==geta)
{
printf("%d %s %s %s %s %d\n",x[ hasht[gett]
[i] ].id,x[hasht[gett][i]].title,x[hasht[gett][i]].genre,x[hasht[gett]
[i]].author,x[hasht[gett][i]].language,x[hasht[gett][i]].year);
}
}
}

else if(qx==8)
{
scanf("%s%s",author,gen);
long long int geta=strhash(author),getg=strhash(gen);

for(i=0; i<cntg[getg]; i=i+1)


{
if(strhash(x[ hashg[getg][i] ].author )==geta)
{
printf("%d %s %s %s %s %d\n",x[ hashg[getg]
[i] ].id,x[hashg[getg][i]].title,x[hashg[getg][i]].genre,x[hashg[getg]
[i]].author,x[hashg[getg][i]].language,x[hashg[getg][i]].year);
}
}

else if(qx==9)
{
scanf("%s%s",gen,language);
long long int getg=strhash(gen),getl=strhash(language);

for(i=0; i<cntl[getl]; i=i+1)


{
if(strhash(x[ hashl[getl][i] ].genre )==getg)
{
printf("%d %s %s %s %s %d\n",x[ hashl[getl]
[i] ].id,x[hashl[getl][i]].title,x[hashl[getl][i]].genre,x[hashl[getl]
[i]].author,x[hashl[getl][i]].language,x[hashl[getl][i]].year);
}
}
}

You might also like