牛半仙的妹子串

91 篇文章 0 订阅
89 篇文章 0 订阅

牛半仙的妹子串 ⁡ \operatorname{牛半仙的妹子串}

题目链接: nowcoder 212921 ⁡ \operatorname{nowcoder\ 212921} nowcoder 212921

关于这场比赛

——>点我可以查看其它题目(目录)<——

到牛客看

——>点我跳转<——

题目

题目描述
牛半仙有 n n_{} n 个妹子。
牛半仙用对于每个妹子都有一个名字,并且给了每个妹子一个评分。
牛半仙的审美与名字有关,他想知道名字以某字母结尾的妹子中,评分第 k k_{} k 大的妹子的名字。
如果出现评分相同的妹子,牛半仙会认为先读入的妹子评分更大。

由于牛半仙是只死鸽子,于是他找到了你,请你帮帮他。

输入

第一行两个正整数 n , m n,m_{} n,m
接下来 n n_{} n 行,每行一个妹子名,保证由小写字母组成,长度不超过 50 50 50,然后一个整数,表示这个妹子的评分。
接下来 m m_{} m 行,每行一个字母 x x_{} x,表示询问名字以某个字母结尾的妹子,然后一个正整数 k k_{} k,表示询问排名为 k k_{} k 的妹子。

输出

m m m 行,每个询问输出一行,表示妹子的名字。
如果名字以 x x_{} x 结尾的妹子中不存在排名为 k k_{} k 的妹子,输出 Orz YYR tql。(不需要输出引号)

样例输入

5 2
aaa 1
aa 2
a 3
ab 3
bb 4
b 2
a 4

样例输出

ab
Orz YYR tql

数据范围

对于 5 % 5\% 5% 的数据: n ≤ 10 , m ≤ 1000 n≤10,m≤1000 n10,m1000
对于 20 % 20\% 20% 的数据: n , m ≤ 1000 n,m\leq 1000 n,m1000
对于所有数据 n , m ≤ 1 0 5 , k ≤ n n,m\leq 10^5,k\leq n n,m105,kn,保证名字长度小于等于 50 50 50

思路

这道题是一道模拟题。

没什么好说的,读入,对于每一个结尾的字母按要求关键字排序,然后就按要求找就完事了。

比赛时

差点出事,一开始用了 string ,然后 MLE,不知所措。

后来才想起来 string 内存极大,不如开 char
然后就过了。

(没想要要用 char 的时候我还以为要用 Trie 树或者 hash 来优化内存,我真是个憨憨)

在这里插入图片描述

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

struct node {
	char x[61];
	int size, num;
}mz[26][100001];
int n, m, tmpl, num[26], x, size;
char c, tmp[61];

bool cmp(node x, node y) {
	if (x.size != y.size) return x.size > y.size;
	return x.num < y.num;
}

int main() {
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) {
		size = 0;
		
		c = getchar();
		while (c < 'a' || c > 'z') c = getchar();
		while (c >= 'a' && c <= 'z') {
			tmp[size++] = c;
			tmpl = c - 'a';
			c = getchar();
		}
		scanf("%d", &x);
		
		num[tmpl]++;
		for (int j = 0; j < size; j++) mz[tmpl][num[tmpl]].x[j] = tmp[j];
		mz[tmpl][num[tmpl]].size = x;
		mz[tmpl][num[tmpl]].num = i;
	}
	
	for (int i = 0; i < 26; i++) sort(mz[i] + 1, mz[i] + num[i] + 1, cmp);
	
	for (int i = 1; i <= m; i++) {
		c = getchar();
		while (c < 'a' || c > 'z') c = getchar();
		scanf("%d", &x);
		if (num[c - 'a'] < x) printf("Orz YYR tql\n");
			else {
				for (int j = 0; j < strlen(mz[c - 'a'][x].x); j++) putchar(mz[c - 'a'][x].x[j]);
				printf("\n");
			}
	}
	
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值