牛半仙的妹子串
解题思路
快排,预处理,
O
(
1
)
O(1)
O(1) 输出。
好吧,其实正解是将以26个字母结尾的输入存入26个数组里,然后逐个排序,
O
(
1
)
O(1)
O(1) 输出。
但是呢,因为我比较懒,而且第一个方法也没什么毛病,所以我就不敲方法二了,至于第一种方法的代码,各位看看就可以了 (因为比较傻逼)
code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#define ll long long
using namespace std;
ll n,m;
ll num[100010];
struct abc{
string name;
ll p,nan;
char end;
}a[100010];
bool cmp(abc a,abc b)
{
if(a.end!=b.end)
return a.end<b.end;
if(a.p!=b.p)
return a.p>b.p;
return a.nan<b.nan;
}
int main()
{
cin>>n>>m;
for(ll i=1;i<=n;i++)
{
cin>>a[i].name>>a[i].p;
a[i].end=a[i].name[a[i].name.size()-1];
a[i].nan=i;
}
sort(a+1,a+1+n,cmp);
for(ll i=1;i<=n;i++)
if(a[i].end!=a[i-1].end)
num[a[i].end-'a']=i;
num[26]=n+1;
for(ll i=25;i>=0;i--)
if(num[i]==0)
num[i]=num[i+1];
for(ll i=1;i<=m;i++)
{
char x;
ll k;
cin>>x>>k;
if(num[x-'a']==0)
{
cout<<"Orz YYR tql"<<endl;
continue;
}
if(num[x-'a'+1]-num[x-'a']<k)
{
cout<<"Orz YYR tql"<<endl;
continue;
}
cout<<a[num[x-'a']+k-1].name<<endl;
}
}