1996. 打乱字母
作者:
cyuyu
,
2022-01-10 18:41:51
,
所有人可见
,
阅读 222
折磨了本菜鸡一下午,本来思路是用pair<char,char>t,t[i].first,t[i].second分别表示一个
字符串的最小和最大的字符,想让他们按照升序进行排序,但是没有把pair的性质搞清楚,
这两个元素是在一起的不能分开,所以不可能实现两个元素均按升序排列,原先的思路就是
利用二分将最小/大字符按照升序得出其最小/最大位置。
第二次以为利用字符串进行升序,然后将全部字符串进行排序,二分后得出每个字符的最小和最大位置
这肯定不对。
正确思路是用正序字符串同逆序字符串进行比较二分后得出其最小和利用逆序和正序字符串进行二分,
得出最大位置,并且第二个二分是mid=(l+r+1)/2的模板,不是mid=(l+r)/2,如果用后者第二个位置
出现问题,这两个二分模板的异同点需要搞明白!!!!
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
const int N=1e5+10;
string u[N];
string d[N];
string o[N];
string q[N];
int main(){
int n;
cin>>n;
string s;
int k=0,p=0;
for(int i=0;i<n;i++){
cin>>s;
sort(s.begin(),s.end());
u[i]=s;//abcd
o[i]=s;
reverse(s.begin(),s.end());
d[i]=s;//dcba
q[i]=s;
}
sort(u,u+n);
sort(d,d+n);
int l,r;
for(int i=0;i<n;i++){
l=0;
r=n-1;
while(l<r){
int mid=(l+r)/2;
if(o[i]<=u[mid]){
r=mid;
}
else{
l=mid+1;
}
}
cout<<l+1<<' ';
l=0;
r=n-1;
while(l<r){
int mid=(l+r)/2;
if(q[i]<=d[mid]){
r=mid;
}
else{
l=mid+1;
}
}
cout<<l+1<<endl;
}
return 0;
}
一个需要找到>=x的第一个数,另一个需要找到<=x的最后一个数
https://www.acwing.com/solution/content/3338/