这道题目卡内存卡得厉害,多次尝试得出结论用string一定会MLE,因为string对象一般都会预留空间;使用二恶心分查找 hash map都可以实现,二分查找更大众化,第二次使用的时候又碰到一个更恶心的事情 搞了我一个小时才发现 郁闷 知道这道题目卡内存 故意在声明结构体时比较精打细算 魔法名设为21 后来才发现最大20个字母是不包括两个括号字符的 有点不懂 怎么不会报运行时错误,越界或者空间不够,(测试过是不会报错 这种问题只能在编译时提醒 运行过程中尽最大努力利用空间,字符串越界会出现一些不可预期的行为 没有终止空格了)
看来zoj试题的测试用例一般都包含边界情况,一定要小心 有时候浪费一点空间还是保险一点
#include
#include
using namespace std;
struct code
{
char name[25];
char func[85];
};
code record1[100000];
code record2[100000];
void bi_search(char* s,int low,int high,int tag)
{
int mid;
if(tag==0)
{
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(record1[mid].name,s)==0){cout<
else low=mid+1;
}
cout<<"what?"<
else
{
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(record2[mid].func,s)==0)
{
int len=strlen(record2[mid].name);
record2[mid].name[len-1]='/0';
cout<
return;
}
else if(strcmp(record2[mid].func,s)>0)high=mid-1;
else low=mid+1;
}
cout<<"what?"<
}
int cmp1(code x,code y)
{
return strcmp(x.name,y.name)<0;
}
int cmp2(code x,code y)
{
return strcmp(x.func,y.func)<0;
}
int main()
{
int top=-1;
char input[120];
while(gets(input)&&strcmp(input,"@END@")!=0)
{
int i=0;
while(input[i]!=']')i++;
//++top;
strncpy(record1[++top].name,input,i+1),record1[top].name[i+1]='/0';
strcpy(record2[top].name,record1[top].name);
int len=strlen(input); int n;
strncpy(record1[top].func,input+i+2,len-i-2),record1[top].func[len-i-2]='/0';
strcpy(record2[top].func,record1[top].func);
}
//for(int j=0;j<=top;j++)
//cout<
sort(record2,record2+top+1,cmp2);
//for( j=0;j<=top;j++)
//cout<
cin>>n;
getchar();//qu diao huan hang
while(n--)
{
gets(input);
if(input[0]=='[')bi_search(input,0,top,0);
else bi_search(input,0,top,1);
}
return 0;
}