hdu 1880 二分+快排 水题

题意是这样的

给你很多对字符串(<100000)  然后询问n次      输出对应的字符串    如果不存在   输出 what?

说一下我之前的思路

开始感觉是字典树的题   后来看了下范围(串2<100   串2<80)   果断会爆内存         


后来用容器做的   还是超内存了   ( 听说容器可以过,我容器学的不咋的)

  最后回到了暴力   用二分和快排A掉了     开内存是注意     千万别开太大    我是刚好卡过的

#include
#include
#include
#include
using namespace std;

struct node
{
    char str1[82],str2[82];//****这里刚好  再大就爆了*********
}mark[200001];
int cmp(node a,node b)
{
    if(strcmp(a.str1,b.str1)<0) return 1;//尽量不要直接比较  以前wa过
    else return 0;
}
int main()
{
    char str[100],str1[100],*q;
    int t=0,n,i;
     while(gets(str))
    {   
        if(strcmp(str,"@END@")==0) break;
        int len=strlen(str);
        for(i=0;str[i]!=']';i++);
        str[i+1]='\0';
        q=str+i+2;
        strcpy(mark[++t].str1,str);
        strcpy(mark[t].str2,q);
        strcpy(mark[++t].str1,q);
        for(i=1;str[i]!=']';i++)
        {
            //str[i-1]=str[i];
            mark[t].str2[i-1]=str[i];
        }
        //str[i-1]='\0';
        mark[t].str2[i-1]='\0';
        //strcpy(mark[t].str2,str);
    }
    sort(mark+1,mark+1+t,cmp);
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        gets(str);
        int a=1,b=t;
        if(strcmp(mark[a].str1,str)==0) cout<<mark[a].str2<<endl;
        else if(strcmp(mark[b].str1,str)==0) cout<<mark[b].str2<<endl;
        else
        {
            int mid,flash=0;
            mid=(a+b)/2;
            while(1)
            {
                if(mid==a||mid==b) break;
                if(strcmp(mark[mid].str1,str)<0)
                a=mid;
                else if(strcmp(mark[mid].str1,str)>0)
                b=mid;
                else {flash=1;break;}
                mid=(a+b)/2;
            }
            if(flash) cout<<mark[mid].str2<<endl;
            else 
            {
                printf("what?\n");
            }
        }
    }
    return 0;
}

你可能感兴趣的:(二分)