Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <string>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <stack>
- #include <queue>
- #include <list>
- #include <map>
- #include <set>
- #include <stdlib.h>
- #include <sstream>
- #include <assert.h>
- #include <memory.h>
- #include <complex>
- #include <time.h>
- #pragma comment(linker, "/STACK:100000000")
- using namespace std;
- #define mp make_pair
- #define pb push_back
- #define ll long long
- #define sz(x) (int)(x).size()
- char tmpstr[100100];
- int cnt[26];
- vector<int> v[100100];
- pair<int, int> pos[26];
- int main() {
- //freopen("palindrome.in","rt",stdin);
- //freopen("palindrome.out","wt",stdout);
- int T;
- scanf("%d", &T);
- gets(tmpstr);
- for(int t = 0; t < T; t++) {
- gets(tmpstr);
- string s(tmpstr);
- for(int i = 0; i < 26; i++) cnt[i] = 0;
- int sum = 0;
- for(int i = 0; i < sz(s); i++) cnt[s[i]-'a']++, sum++;
- for(int i = 0; i < sz(s); i++) v[i].clear();
- int p = 0;
- for(int i = 0; i < 26; i++) {
- p = max(p, cnt[i]);
- pos[i] = mp(cnt[i], sz(v[cnt[i]]));
- v[cnt[i]].pb(i);
- }
- int l1 = 26, l2 = 26;
- for(int i = 0; i < 26; i++) {
- if(cnt[i] != 0) {
- if(l1 == 26) {
- l1 = i;
- }
- else if(l2 == 26) {
- l2 = i;
- break;
- }
- }
- }
- string res = "";
- int lst = -1;
- for(int step = 0; step < sz(s); step++) {
- if((sum & 1) && p * 2 > sum) { // ставим тот, которого больше
- int idx = v[p][0];
- if(idx >= 26 || cnt[idx] == 0) break;
- if(idx == lst) break;
- res += (idx + 'a');
- pos[idx] = mp(p - 1, sz(v[p-1]));
- v[p-1].pb(idx);
- v[p].pop_back();
- while(p >= 0 && sz(v[p]) == 0) p--;
- cnt[idx]--;
- if(cnt[idx] == 0) {
- if(idx == l1) {
- l1 = l2;
- l2++;
- while(l2 < 26 && cnt[l2] == 0) l2++;
- }
- else if(idx == l2) {
- while(l2 < 26 && cnt[l2] == 0) l2++;
- }
- }
- lst = idx;
- }
- else if(l1 != lst) {
- int idx = l1;
- if(idx >= 26 || cnt[idx] == 0) break;
- res += (idx + 'a');
- int pp = pos[idx].first;
- int ss = pos[idx].second;
- if(ss != sz(v[pp]) - 1) {
- int who = v[pp][sz(v[pp]) - 1];
- pos[who] = pos[idx];
- swap(v[pp][ss], v[pp][sz(v[pp])-1]);
- }
- v[pp].pop_back();
- pos[idx] = mp(pp-1, sz(v[pp-1]));
- v[pp-1].pb(idx);
- cnt[idx]--;
- while(p >= 0 && sz(v[p]) == 0) p--;
- if(cnt[idx] == 0) {
- l1 = l2;
- l2++;
- while(l2 < 26 && cnt[l2] == 0) l2++;
- }
- lst = idx;
- }
- else {
- int idx = l2;
- if(idx >= 26 || cnt[idx] == 0) break;
- res += (idx + 'a');
- int pp = pos[idx].first;
- int ss = pos[idx].second;
- if(ss != sz(v[pp]) - 1) {
- int who = v[pp][sz(v[pp]) - 1];
- pos[who] = pos[idx];
- swap(v[pp][ss], v[pp][sz(v[pp])-1]);
- }
- v[pp].pop_back();
- pos[idx] = mp(pp-1, sz(v[pp-1]));
- v[pp-1].pb(idx);
- cnt[idx]--;
- while(p >= 0 && sz(v[p]) == 0) p--;
- if(cnt[idx] == 0) {
- while(l2 < 26 && cnt[l2] == 0) l2++;
- }
- lst = idx;
- }
- sum--;
- }
- if(sz(res) == sz(s)) {
- puts(res.c_str());
- }
- else {
- res = "IMPOSSIBLE";
- puts(res.c_str());
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement