酷代码 AI
菜单
服务商

每个测试的时间限制为2秒,每个测试的内存限制为256兆字节。你很幸运知道世界上所有重要问题的答案。这次,答案是字符串 s,只由小写英文字母组成。你想隐藏这个字符串。你还有另一个字符串 t,也只由小写英文字母组成。你需要打乱 t 中的字母,使字符串 s 至少在 t 中以子序列* 的形式出现一次。在所有包含 s 作为子序列的 t 的重排中,找到字典序最小† 的一个。 * 如果一个序列 a 可以通过从序列 b 删除若干个(可能为零或全部)任意位置的元素得到,那么序列 a 是序列 b 的子序列。 † 如果以下情况之一成立,则字符串 a 的字典序小于字符串 b:a 是 b 的前缀,但 a≠b;或者在 a 与 b 第一次不同的位置,字符串 a 的字母在字母表中先于字符串 b 的对应字母。 输入 每个测试包含多个测试用例。第一行包含测试用例的数量 T (1≤T≤104 )。接下来是测试用例的具体描述。 每个测试用例的第一行包含字符串 s (1≤|s|≤105 ),其中 |s| 是字符串 s 的长度。 每个测试用例的第二行包含字符串 t (|s|≤|t|≤105 )。 两个字符串都只包含小

```cpp #include<bits/stdc++.h> using namespace std; const int MAXN=100005; int cnt[26]; char s[MAXN],t[MAXN]; int main(){ ios::sync_with_stdio(false); cin.tie(0); int T; cin>>T; while(T--){ cin>>(s+1)>>(t+1); int n=strlen(s+1); int m=strlen(t+1); memset(cnt,0,sizeof(cnt)); for(int i=1;i<=m;i++){ cnt[t[i]-'a']++; } bool possible=true; for(int i=1;i<=n;i++){ if(cnt[s[i]-'a']==0){ possible=false; break; } cnt[s[i]-'a']--; } if(!possible){ cout<<"Impossible\n"; continue; } int pos=2; while(pos<=n&&s[pos]==s[1]){ pos++; } bool putFirstBefore=false; if(pos<=n&&s[pos]<s[1]){ putFirstBefore=true; } string result=""; for(int i=0;i<26;i++){ if(putFirstBefore&&i==s[1]-'a'){ for(int j=1;j<=n;j++){ result+=s[j]; } } for(int j=0;j<cnt[i];j++){ result+=char('a'+i); } if(!putFirstBefore&&i==s[1]-'a'){ for(int j=1;j<=n;j++){ result+=s[j]; } } } cout<<result<<"\n"; } return 0; } ``` 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 字符数组索引从1开始时,strlen要传入s+1计算正确长度 2. 字典序比较时,要考虑s中第一个字符之后字符的大小关系 3. 处理完s中字符后,剩余的t字符要按字母顺序排列 [2025-12-23 18:13:05 | AI写代码神器 | 457点数解答]

相关提问
发财导航,免费问AI
实用工具查看更多