map超空间了,那就排序加二分呗...
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <memory.h>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>
#include <sstream>
using namespace std;
char s[150];
char a[100000][21], b[100000][81];
int sa[100000], sb[100000];
bool sacmp(const int &x, const int &y) {
return strcmp(a[x], a[y]) == -1;
}
bool sbcmp(const int &x, const int &y) {
return strcmp(b[x], b[y]) == -1;
}
int afind(char *s, int k) {
int l = 0, r = k - 1, m, t;
while (l <= r) {
m = (l + r) / 2;
t = strcmp(s, a[sa[m]]);
if (t == -1) r = m - 1;
else if (t == 1) l = m + 1;
else return sa[m];
}
return -1;
}
int bfind(char *s, int k) {
int l = 0, r = k - 1, m, t;
while (l <= r) {
m = (l + r) / 2;
t = strcmp(s, b[sb[m]]);
if (t == -1) r = m - 1;
else if (t == 1) l = m + 1;
else return sb[m];
}
return -1;
}
int main() {
int n, i, j, k;
while (gets(s)) {
k = 0;
do {
if (strcmp(s, "@END@") == 0) break;
for (i = 1, j = 0; s[i] != ']'; i++, j++)
a[k][j] = s[i];
a[k][j] = '\0';
for (i += 2, j = 0; s[i]; i++, j++)
b[k][j] = s[i];
b[k][j] = '\0';
k++;
} while (gets(s));
for (i = 0; i < k; i++)
sa[i] = sb[i] = i;
sort(sa, sa + k, sacmp);
sort(sb, sb + k, sbcmp);
scanf("%d", &n);
getchar();
for (i = 0; i < n && gets(s); i++) {
if (s[0] == '[') {
for (j = 0; s[j+1] && s[j+1] != ']'; j++)
s[j] = s[j+1];-
s[j] = '\0';
j = afind(s, k);
if (j == -1) puts("what?");
else printf("%s\n", b[j]);
} else {
j = bfind(s, k);
if (j == -1) puts("what?");
else printf("%s\n", a[j]);
}
}
}
return 0;
}