题意是这样的
给你很多对字符串(<100000) 然后询问n次 输出对应的字符串 如果不存在 输出 what?
说一下我之前的思路
开始感觉是字典树的题 后来看了下范围(串2<100 串2<80) 果断会爆内存
后来用容器做的 还是超内存了 ( 听说容器可以过,我容器学的不咋的)
最后回到了暴力 用二分和快排A掉了 开内存是注意 千万别开太大 我是刚好卡过的
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> 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; }