#include<bits/stdc++.h>
using namespace std;
int n;
string name[50010],a[50010],b[50010];
int cmp(char sa,char sb){
return sa>sb;
}
int main(){
cin >> n;
for(int i=1;i<=n;i++){
cin >> name[i];
a[i]=name[i];
b[i]=name[i];
sort(a[i].begin(),a[i].end());//a数组存每个字符串字典序最靠前情况
sort(b[i].begin(),b[i].end(),cmp);//b数组存每个字符串字典序最靠后情况
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
for(int i=1;i<=n;i++){
sort(name[i].begin(),name[i].end());
int l=1,r=n;
while(l<r){ //尽量向左查找
int mid=(l+r)/2;
if(name[i]<=b[mid]) r=mid;
else l=mid+1;
}
cout << r << ' ';
reverse(name[i].begin(),name[i].end());
l=1;
r=n;
while(l<r){//尽量向右查找
int mid=(l+r+1)/2;
if(name[i]>=a[mid]) l=mid;
else r=mid-1;
}
cout << r << endl;
}
return 0;
}
练习13,USACO 打乱字母【二分法】
最新推荐文章于 2024-10-18 23:40:34 发布