A 牛半仙的妹子串

预处理,将每个字符串最后的字母转化为数组下标,往数组里对应的结构体。最后查询即可。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using namespace std;
const int N=1e6+10;
struct sa
{
    string s;
    int f;
    int id;
}a[N];
int n,m,k;
char x;
int cmp(const struct sa a , const struct sa b)
{
    if(a.f!=b.f) return a.f>b.f;
    else return a.id<b.id;
}
vector< sa > ans[27] ;// 结构体vector, ans[27]存26个英文字母的下标
int main()
{
    IOS;
    //freopen("data10.in","r",stdin);
    //freopen("w.txt","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i].s>>a[i].f;
        a[i].id=i;
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<=n;i++){
        ans[a[i].s[a[i].s.size()-1]-'a'].push_back(a[i]);
    }
    for(int i=1;i<=m;i++){
        cin>>x>>k;
        if(ans[x-'a'].size()<k) cout<<"Orz YYR tql"<<endl;
        else cout<<ans[x-'a'][k-1].s<<endl;
    }
    return 0;
}

另一种写法

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using namespace std;
const int N=1e6+10;
struct sa
{
    string s;
    int f;
    int id;
    bool operator <(const sa &a) const {//这里符号都是相反的
        if(a.f!=f) return a.f<f;
        else return a.id>id;
    }
}a[N];
int n,m,k;
char x;
vector< sa > ans[27];
int main()
{
    IOS;
    //freopen("data10.in","r",stdin);
    //freopen("w.txt","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i].s>>a[i].f;
        a[i].id=i;
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        ans[a[i].s[a[i].s.size()-1]-'a'].push_back(a[i]);
    }
    for(int i=1;i<=m;i++){
        cin>>x>>k;
        if(ans[x-'a'].size()<k) cout<<"Orz YYR tql"<<endl;
        else cout<<ans[x-'a'][k-1].s<<endl;
    }
    return 0;
}

还是习惯这么写。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

using namespace std;
const int N=1e6+10;
struct sa
{
    string s;
    int f;
    int id;
    friend bool operator < (sa a, sa b){
        if(a.f!=b.f) return a.f>b.f;
        else return a.id<b.id;
    }
}a[N];
int n,m,k;
char x;
vector< sa > ans[27];
int main()
{
    IOS;
    //freopen("data10.in","r",stdin);
    //freopen("w.txt","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i].s>>a[i].f;
        a[i].id=i;
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        ans[a[i].s[a[i].s.size()-1]-'a'].push_back(a[i]);
    }
    for(int i=1;i<=m;i++){
        cin>>x>>k;
        if(ans[x-'a'].size()<k) cout<<"Orz YYR tql"<<endl;
        else cout<<ans[x-'a'][k-1].s<<endl;
    }
    return 0;
}