C. Needle in a Haystack
https://codeforces.com/contest/2175/problem/C
目录
题意:
给定两个字符串s和t,问如何对t进行排列,可以使得t的子序列中存在s,输出字典序最小的那个排列方式,如果不存在这种排列,则输出"Impossible"
思路:
先判断t中是否有s
如果有,先把s从t中剔出来,然后对剩下的t进行排序
然后再用此时的t和s依次从头元素进行比较
二者不相同的话选小的(显而易见)
二者相同选s的头**(t是有序的,但是s不是有序的,有可能s的头后面的元素比s的头要小,此时我们先放s的头,尽可能把后面小的元素往前挪)**
代码:
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
// priority_queue<int, vector<int>, greater<int> > q;
const int N = 4e5+10;
const int inf=1e9;
void solve() {
string s1,s2;
cin >> s1 >> s2;
int a[300]={0};
for(int i=0;i<s1.size();i++) {
a[(int)s1[i]]++;
}
vector<char> p;
for (int i=0;i<s2.size();i++) {
if (a[(int)s2[i]]) {
a[(int)s2[i]]--;
}
else {
p.push_back(s2[i]);
}
}
sort(a,a+300);
if (a[299]) {
cout << "Impossible" << endl;
return ;
}
sort(p.begin(),p.end());
int j=0,k=0;
for (;j<s1.size()&&k<p.size();) {
if (s1[j]<p[k]) {
cout << s1[j] ;j++;
}else if (s1[j]>p[k]) {
cout << p[k] ;k++;
}else {
cout << s1[j] ;j++;
}
}
if (j<s1.size()) {
for (int i=j;i<s1.size();i++){
cout << s1[i];
}
}else {
for (int i=k;i<p.size();i++){
cout << p[i];
}
}
cout << endl;
}
signed main() {
int q;
cin >> q;
while (q--) {
solve();
}
return 0;
}