牛半仙的妹子串


解题思路
快排,预处理,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;
}
}
本文介绍了一种使用快速排序算法解决妹子串问题的方法,并通过预处理实现了O(1)时间复杂度的输出。文章详细展示了如何将输入字符串按结尾字符分类存储,再分别进行排序的过程。

被折叠的 条评论
为什么被折叠?



