打乱字母题解报告
标签:二分 字符串
来源:acwing
解题思路:
首先思考如何得到最高排名和最低排名
好比打比赛,一个最拉状态的人和其他都处于最佳状态的比较,得到的成绩会更差
反则反之
首先我们将每个字符串的字符都按升序排布,
存储在vector a,b中
然后使用字符串翻转得到降序字符,存入c中
在对b,c进行排列
随后依次使用二分查找
在c中二分查找a(升序)得到最前排名
再在b中二分查找a(降序)得到最后排名
代码实现:
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int n;
cin>>n;
vector <string> a,b,c;
for(int i=1;i<=n;i++){
string s;
cin>>s;
sort(s.begin(),s.end());
a.push_back(s);
b.push_back(s);
reverse(s.begin(),s.end());
c.push_back(s);
}
sort(b.begin(),b.end());
sort(c.begin(),c.end());
for(int i=0;i<n;i++){
string s=a[i];
int min=lower_bound(c.begin(),c.end(),s)-c.begin()+1;
reverse(s.begin(),s.end());
int max=upper_bound(b.begin(),b.end(),s)-b.begin();
cout<<min<<" "<<max<<endl;
}
}