どれでもドア:http://codeforces.com/problemset/problem/777/D
水题:删除其中一些字符串的一段连续的字符(必须是一直删除到结尾),使每个字符串按照字典序排序后,与输入时的位置相同。
方法:倒着两个两个比较,前面字符串的比后面的大的话就删除前者一段字符串,
删除时用二分查找删除字符数最少的位置。
CODE:
void change(string &str1,string &str2){
int l=1,r=str1.length(),mid;
string s;
while(r-l>1){
s=str1;
mid=l+(r-l)/2;
if(s.erase(mid)<str2){
l=mid;
}
else if(s.erase(mid)>str2){
r=mid;
}
else {
l=mid+1;
break;
}
}
s=str1;
if(s.erase(l)<=str2)
str1.erase(l);
else
str1.erase(l-1);
}
string str[MAX];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>str[i];
for(int i=n-1;i>0;i--){
if(str[i-1]>str[i]){
change(str[i-1],str[i]);
}
}
for(int i=0;i<n;i++){
cout<<str[i]<<endl;
}
return 0;
}