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;
}