1.Acwing每日一题:
解题思路:
1.将打乱的字母顺序按从小到大排序和从大到小排序分别存储在一个容器中
2.将两个容器从小到大排序,在将原容器中元素一个一个比较
3.在倒序容器中第一个大于或者等于他的元素的位置即为最低位置,但由于下标原因要+1
4.在升序容器中第一个大于元素的位置即为最高位置,这里不需要+1,因为下标+1,位置-1.
注意:
1.三容器原容器不需要排序
2.找最低和最高条件不一样
3.不能使用find函数来查找,需要使用lower_bound函数和upper_bound函数
4.reverse函数为翻转函数
5.sort函数排序的两个额外参数 less<类型>() greater<类型>() 分别是从小到大和从大到小
具体lower_bound函数 upper_bound函数和find可以参考如下文章:
c++的lower_bound函数、upper_bound和find函数_无敌少年小旋风的博客-CSDN博客
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
vector<string>a, b, c;
int main()
{
int n;
cin >> n;
string s;
for (int i = 0; i < n; i++)
{
cin >> s;
sort(s.begin(), s.end(), less<char>());
a.push_back(s);
b.push_back(s);
reverse(s.begin(), s.end());
c.push_back(s);
}
sort(b.begin(), b.end(), less<string>());
sort(c.begin(), c.end(), less<string>());
int l1, l2;
for (auto &x : a)
{
l1 = lower_bound(c.begin(), c.end(), x) - c.begin() + 1;
reverse(x.begin(), x.end());
l2 = upper_bound(b.begin(), b.end(), x) - b.begin();
cout << l1 << " " << l2 << endl;
}
return 0;
}