#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
int cnt[26] ={0};
stack<char> sta[26];
int fun(char a, char b){
return a < b;
}
int main(){
string str;
cin >> str;
int i;
int possible = 1;
for(i = 0; i < str.length(); i++){
char temp = str[i];
cnt[(int)temp-(int)'a']++;
}
int maxd = 0;
char strarr[100001];
for(i = 0; i < 26; i++){
maxd = cnt[i] > maxd ? cnt[i] : maxd;
if(cnt[i] > str.length() / 2){
possible = 0;
}
}
if(!possible){
cout << "impossible" << endl;
}
else{
for(i = 0; i < str.length(); i++){
strarr[i] = str[i];
}
sort(strarr, strarr + str.length(), fun);
for(i = 0; i < str.length(); i++){
sta[(int)strarr[i] - (int)'a'].push(strarr[(i+maxd)%str.length()]);
}
for(i = 0; i < str.length(); i++){
char temp = str[i];
cout << sta[(int)temp-(int)'a'].top();
sta[(int)temp-(int)'a'].pop();
}
cout << endl;
}
return 0;
}
代码仅供A题
一种可行的替换方案是将所有字符排序,每个字符都用其后的第x个字符代换,x为最多的那个字符的数量。再将这种替换关系代回原串中。
该替换方案的代码实现
补充说明一下,这个构造法是基于这样一个显而易见的事实的:原串可以易位构词 <=> 按照字符数目从大到小进行重排的串可以易位构词
重排演示:ababa => aaabb