#include <cstdio>
#include <algorithm>
#include <string>
using std::sort;
using std::string;
const int N = 300000 + 10, M = 300000 + 10, P = 300000 + 10;
struct Node {
string s;
int num;
int type;
} a[N], b[N];
struct Edge{
int l, r;
}e1[P];
int e[M];
bool cmp(Node x, Node y){
if(x.s == y.s) return x.type < y.type;
return x.s < y.s;
}
bool cmp1(Node x, Node y){
if(x.s == y.s) return x.type > y.type;
return x.s < y.s;
}
int n, m, p;
int main() {
scanf("%d", &n);
int cnt = 0;
for (int i = 1; i <= n; i++) {
char ch[N];
scanf("%s", ch);
++cnt;
a[cnt] = { string(ch), cnt , 0};
b[cnt] = { string(ch), cnt , 0};
}
sort(a + 1, a + cnt + 1, cmp);
for (int i = 1; i <= cnt; i++) printf("%d ", a[i].num);
putchar('\n');
scanf("%d", &m);
for (int i = 1; i <= m; i++) {
char ch[N];
scanf("%s", ch);
++cnt;
a[cnt] = {string(ch), i, 1};
}
sort(a + 1, a + cnt + 1, cmp);
int c = 0;
for(int i = 1; i <= cnt; i++){
if(a[i].type == 0) c++;
if(a[i].type == 1) e[a[i].num] = c;
}
for(int i = 1; i <= m; i++) printf("%d ", e[i]);
putchar('\n');
scanf("%d", &p);
int cnt1 = n;
for(int i = 1; i <= p; i++){
char ch[N];
scanf("%s", ch);
++cnt1;
b[cnt1] = {string(ch), i, 1};
++cnt1;
b[cnt1] = {string(ch) + "{", i, 1};
}
sort(b + 1, b + cnt1 + 1, cmp1);
c = 0;
for(int i = 1; i <= cnt1; i++){
if(b[i].type == 0) c++;
if(b[i].type == 1){
if(b[i].s[b[i].s.size() - 1] == '{') e1[b[i].num].r = c;
else e1[b[i].num].l = c;
}
}
for(int i = 1; i <= p; i++) printf("%d ", e1[i].r - e1[i].l);
putchar('\n');
return 0;
}
【无标题】
最新推荐文章于 2024-01-18 23:25:36 发布