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;
} 
京公网安备 11010502036488号