注意点就是,仔细看题的要求,一个是ID**一个年份**,其他的的要求都比较一般.
一开始我没考虑输入信息的valid性, 没有AC, 后来试着更改ID的输入要求, 不符合ID要求的书目信息是无效的, 年份的有效性加不加都可以AC,我这里为了严谨性加上了.
还有一个就是搜索的问题, 这里的题意应该是前面的数字序号对应的类别,比如1:指的是,后面的字符串查找的就是题目等等,但是我这里是把他看作”黑箱查找”,来做的,就是这里的用户query可能是5个信息的任何一个,所以在查找的时候,每个类别都遍历了一遍,当然这会包含题目中的这种情况,因为题目要求的时间比较宽松,所以我这种也可以AC.当然如果想完全按照题目出题思路来,就自己添加个变量,来判断前面的数字就好.
最后我这里先将书目按照ID排序,这样边查找就可以边输出.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxNum 10001
#define maxTapLength 81 //title, author, and pulisher's length
#define maxKeyLength 11
#define maxKeyNum 6
#define maxYearLength 5
#define maxIdLength 8
typedef struct libNode{
char tit[maxTapLength],aut[maxTapLength],pub[maxTapLength];
char keys[maxKeyNum][maxKeyLength],year[maxYearLength],id[maxIdLength];
int kn; //keys number
} *lib,libNode;
long toNum(char s[])
{
int i,r=0;
for(i=0;i<strlen(s);i++)
{
if(s[i]<'0'||s[i]>'9') return 0;
r=10*r+s[i]-'0';
}
return r;
}
int comp(const void *A,const void *B)
{
lib a=(lib)A,b=(lib)B;
long l=toNum(a->id)-toNum(b->id);
return (int)l;
}
int scanKey(char k[][maxKeyLength])
{
int i=0,j=0;
char c;
while((c=getchar())!='\n')
{
if(c>='A'&&c<='Z') c=c-'A'+'a';
if(c==' ')
{
/*end of a key*/
k[i++][j]='\0';
j=0;
}
else k[i][j++]=c;
}
k[i++][j]='\0';
return i;
}
void scan(char *s)
{
int i;
char c;
i=0;
while((c=getchar())!='\n')
{
if(c>='A'&&c<='Z') c=c-'A'+'a';
s[i++]=c;
}
s[i]='\0';
}
void search(char s[],lib a,int n)
{
int i,j,innerFlag,outterFlag=0;
printf("%s\n",s);
for(i=2;i<strlen(s);i++)
if(s[i]!=' ') break;
strcpy(s,s+i); /*valid string starts from the first non-space character*/
for(j=0;j<strlen(s);j++)
if(s[j]<='Z'&&s[j]>='A') s[j]=s[j]-'A'+'a';
/*main search*/
for(i=0;i<n;i++)
{
innerFlag=0;
if(!strcmp(s,a[i].tit)) innerFlag=outterFlag=1;
if(!strcmp(s,a[i].aut)) innerFlag=outterFlag=1;
if(strlen(s)<maxKeyLength)
{
for(j=0;j<a[i].kn;j++)
if(!strcmp(s,a[i].keys[j])) innerFlag=outterFlag=1;
}
if(!strcmp(s,a[i].pub)) innerFlag=outterFlag=1;
if(!strcmp(s,a[i].year)) innerFlag=outterFlag=1;
if(innerFlag) printf("%s\n",a[i].id);
}
if(!outterFlag) printf("Not Found\n");
}
int isValid(char s[])
{
int i;
if(strlen(s)>7||strlen(s)<7) return 0;
for(i=0;i<strlen(s);i++)
if(s[i]<'0'||s[i]>'9') return 0;
return 1;
}
int main()
{
int n,i,m;
long y;
char s[maxTapLength];
lib l;
scanf("%d",&n);
getchar();
l=(lib)malloc(sizeof(libNode)*n);
for(i=0;i<n;i++)
{
scan(l[i].id);
scan(l[i].tit);
scan(l[i].aut);
l[i].kn=scanKey(l[i].keys);
scan(l[i].pub);
scan(l[i].year);
y=toNum(l[i].year);
if((y<1000||y>3000)||!isValid(l[i].id))
{
/*valid book INFO*/
i--;n--;
}
}
qsort(l,n,sizeof(libNode),comp);
scanf("%d",&m);
getchar();
for(i=0;i<m;i++)
{
gets(s);
search(s,l,n);
}
return 0;
}