题目描述

在数据库的操作过程中,我们进场会遇到检索操作。这个题目的任务是完成一些特定格式的检索,并输出符合条件的数据库中的所有结果。 
我们现在有一个数据库,维护了学生的姓名(Name),性别(Sex)以及出生日期(Birthday)。其中,Name项是长度不超过30的字符串,只可能包含大小写字母,没有空格;Sex项进可能为‘Male’或者‘Female’(不含引号);Birthday项以yyy/mm/dd的格式存储,如:1990/01/01, 
1991/12/31,等等。 
每个查询所可能包含的条件如下: 
Name=‘REQUIRED_NAME’,查询姓名为REQUIRED_NAME的学生,其中REQUIRED_NAME为长度在1到30之间的字符串; 
Sex=‘Male’或Sex=‘Female’,查询性别为男/女的学生; 
Birthday=‘yyy/mm/dd’,查询出生年/月/日为特定值的学生。如果其中某项为’’,则说明该项不受限制。例如,‘1990/06/’表示1990年6月出生,‘/03/’表示出生月份为3月。 
给定数据库的所有表项以及若干条查询,你需要对每条查询输出它返回的结果。 

输入

输入包含多组测试数据。输入的第一行为测试数据的组数T(1<=T<=50)。 
对于每组测试数据,第一行是两个整数N和M(N,M<=500),分别表示数据的数量以及查询的数量。 
接下来N行,每行以Name Sex Birthday的形式给出每个学生的信息。 
没下来M行,每行给出若干条限制条件,以空格隔开。条件以Name Sex Birthday的顺序给出(如果存在),且每种限制条件最多只出现一次。 

输出

对于每条查询,按照输入的顺序输出符合条件的学生姓名,每个一行。如果没有符合查询的信息,则输出一行NULL。

样例输入

1
5
6
Michael Male 1990/02/28
Amy Female 1992/04/03
Tom Male 1991/12/15
Lynn Female 1991/04/09
Zheng Male 1990/04/20
Name='Amy'
Name='Betty'
Sex='Female' Birthday='*/04/09'
Sex='Female' Birthday='*/*/*'
Name='Michael' Sex='Female'
Name='Michael' Sex='Male' Birthday='1990/02/*'

样例输出

Amy
NULL
Lynn
Amy
Lynn
NULL
Michael

来源

2014软院D题

。。。。。TLE了,具体原因是string用得太多,应改为char数组,TLE的版本。。。。↓

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
using namespace std;
struct dog
{
string sex;
string birthday;
};
map<string,dog> donser;
bool deal(string a,string b)
{
string temp="/";
int pos1=a.find(temp[]);
int pos2=b.find(temp[]);
if(pos1==pos2)
{
string s1=a.substr(,pos1);
string s2=b.substr(,pos2);
if(s1!=s2)
return false;
}
a.erase(,pos1+);
b.erase(,pos2+);
pos1=a.find(temp[]);
pos2=b.find(temp[]);
if(pos1==pos2)
{
string s1=a.substr(,pos1);
string s2=b.substr(,pos2);
if(s1!=s2)
return false;
}
a.erase(,pos1+);
b.erase(,pos2+);
if(a.size()==b.size())
{
if(a!=b)
return false;
}
return true;
}
int main()
{
int tes,m,n;
//freopen("test.out","w",stdout);
while(~scanf("%d",&tes))
{
while(tes--)
{
cin>>m>>n;
while(m--)
{
string a,b,c;
cin>>a>>b>>c;
donser[a].sex=b;
donser[a].birthday=c;
}
cin.get();
while(n>)
{
n--;
string str,temp="a'a",c_name="",c_sex="",c_birth="";
bool lable=false,named=false,sexd=false,birthd=false;
getline(cin,str);
if(str[]=='N')
{
str.erase(,);
int pos=str.find(temp[]);
c_name=str.substr(,pos);
named=true;
str.erase(,pos+);
if( donser.find(c_name)==donser.end())
{
cout<<"NULL"<<endl;
continue;
}
if(str.size()>)
str.erase(,);
}
if(str.size()>&&str[]=='S')
{
str.erase(,);
int pos=str.find(temp[]);
c_sex=str.substr(,pos);
sexd=true;
str.erase(,pos+);
if(str.size()>)
str.erase(,);
}
if(str.size()>&&str[]=='B')
{
str.erase(,);
int pos=str.find(temp[]);
c_birth=str.substr(,pos);
birthd=true;
str="";
}
if(named)
{
if((donser[c_name].sex==c_sex||sexd==false)&&(deal(donser[c_name].birthday,c_birth)||birthd==false))
cout<<c_name<<endl;
else
cout<<"NULL"<<endl;
}
else
{
map<string,dog>::iterator it;
for(it=donser.begin();it!=donser.end();it++)
{
if((it->second.sex==c_sex||sexd==false)&&(deal(it->second.birthday,c_birth)||birthd==false))
{
cout<<it->first<<endl;
lable=true;
}
}
if(lable==false)
cout<<"NULL"<<endl;
}
}
donser.clear();
}
}
return ;
}

BUPT复试专题—数据库检索(2014软院)的更多相关文章

  1. BUPT复试专题—奇偶求和(2014软件)

    题目描述 给出N个数,求出这N个数,奇数的和以及偶数的和. 输入 第一行为测试数据的组数T(1<=T<=50).请注意,任意两组测试数据之间是相互独立的. 每组数据包括两行: 第一行为一个 ...

  2. BUPT复试专题—网络传输(2014网研)

    题目描述 网络的高效互联与智能传输是提升海量用户服务请求映射效率的重要措施.在这个任务中,你需耍在最小的传输时间内,将数据源传输到指定的网络节点中.我们给定的网络一共包含N个节点,其中节点1为数据源. ...

  3. BUPT复试专题—进程管理(2014网研)

    题目描述 在操作系统中,进程管理是非常重要的工作.每个进程都有唯一的进程标识PID.每个进程都可以启动子进程,此时我们称该它本身是其子进程的父进程.除PID为0的进程之外,每个进程冇且只冇一个父进程. ...

  4. BUPT复试专题—分数加法(2014网研)

    题目描述 求2^-a + 2^-b,其中a和b均为正整数,结果用最简分数表示 输入 第一行为测试数据的组数T (1~400).请注意,任意两组测试数据之间相互独立的.每组测试数据一行,包含两个整数a和 ...

  5. BUPT复试专题—Python List(2014)

    题目描述 在Python中,List (列表)是一种非常重要的数据结构.它与C/C++/Java中的 数组有些类似,但支持添加新元素时的动态扩展.在这个问题中,你需要处理如下 的几种对List的操作. ...

  6. BUPT复试专题—字符串转换(2013计院)

    题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串.现在给你一个仅由小写字母组成的字符串, ...

  7. BUPT复试专题—统计时间间隔(2013计院)

    题目描述 给出两个时间(24小时制),求第一个时间至少要经过多久才能到达第二个时间.给出的时间一定满足的形式,其中x和y分别代表小时和分钟.0≤x<24,0≤y<60. 输入格式 第一行为 ...

  8. BUPT复试专题—最近公共祖先(2014软院)

    题目描述 给出一棵有N个节点的有根树TREE(根的编号为1),对于每组查询,请输出树上节点u和v的最近公共祖先. 最近公共祖先:对于有向树TREE的两个结点u,v.最近公共祖先LCA(TREE u,v ...

  9. BUPT复试专题—最长连续等差子数列(2014软院)

    题目描述   给定-个长度为N的整数数列,你需要在其中找到最长的连续子数列的长度, 并满足这个子数列是等差的.注意公差小于或等于0的情况也是允许的. 输入 第一行为数据组数T(1~100),表示测试数 ...

随机推荐

  1. 使用dmidecode在Linux下获取硬件信息

    dmidecode命令可以让你在Linux系统下获取有关硬件方面的信息.dmidecode的作用是将DMI数据库中的信息解码,以可读的文本方式显示.由于DMI信息可以人为修改,因此里面的信息不一定是系 ...

  2. linux终端颜色控制

    引言: 由于在c代码中看到过打印彩色字, 又对PS1 想进一步了解,才有了这篇博文.----------------------------------------Linux 终端控制台字体颜色  - ...

  3. R语言基础-list matrix array

    列表可以包含多种类型,如数字/字符/向量/data.frame/list # 创建含一个向量元素的list list1 = list(c(1,2,3)) # list2有三个元素 list2 = li ...

  4. ios开发中关闭textview控件的虚拟键盘

    在ios开发中,textfield控件在点击的时候出现虚拟键盘,关掉虚拟键盘可以通过虚拟键盘中的done button和点击view中的任意地方来关闭虚拟键盘. 1.第一种方法是textfield控件 ...

  5. Aizu-ALDS1_3_A:Stack

    D - Stack Write a program which reads an expression in the Reverse Polish notation and prints the co ...

  6. js根据银行卡号判断属于哪个银行,并返回银行缩写及银行卡类型

      在做绑定银行卡,输入银行卡的时候,产品有这么一个需求,需要用户输入银行卡号的时候,显示对应的银行卡名称及简称.于是苦苦寻觅,终于找到了支付宝的开放API,银行卡校验接口 https://ccdca ...

  7. Docker存储和网络

    Docker存储资源类型 docker两种存储资源类型 用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及到 ...

  8. ctype.h 第2章

    ctype.h ctype.h是c标准函数库中的头文件   定义了一批c语言字符分类函数   (c character classification functions) 用于测试字符是否属于特定的字 ...

  9. A. Light Bulb

    A. Light Bulb Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB   64-bit integer IO f ...

  10. iOS学习笔记17-FMDB

    上一节我已经介绍了SQLite的简单使用,不了解的可以提前去看一下iOS学习笔记16-数据库SQLite,这节我们来讲下FMDB. 一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQL ...