Advertisement
Guest User

Untitled

a guest
Jan 11th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <string>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. #include <stack>
  8. #include <queue>
  9. #include <list>
  10. #include <map>
  11. #include <set>
  12. #include <stdlib.h>
  13. #include <sstream>
  14. #include <assert.h>
  15. #include <memory.h>
  16. #include <complex>
  17. #include <time.h>
  18. #pragma comment(linker, "/STACK:100000000")
  19. using namespace std;
  20.  
  21. #define mp make_pair
  22. #define pb push_back
  23. #define ll long long
  24. #define sz(x) (int)(x).size()
  25.  
  26. char tmpstr[100100];
  27. int cnt[26];
  28. vector<int> v[100100];
  29. pair<int, int> pos[26];
  30.  
  31. int main() {
  32.     //freopen("palindrome.in","rt",stdin);
  33.     //freopen("palindrome.out","wt",stdout);
  34.    
  35.     int T;
  36.     scanf("%d", &T);
  37.     gets(tmpstr);
  38.     for(int t = 0; t < T; t++) {
  39.         gets(tmpstr);
  40.         string s(tmpstr);
  41.         for(int i = 0; i < 26; i++) cnt[i] = 0;
  42.         int sum = 0;
  43.         for(int i = 0; i < sz(s); i++) cnt[s[i]-'a']++, sum++;
  44.         for(int i = 0; i < sz(s); i++) v[i].clear();
  45.         int p = 0;
  46.         for(int i = 0; i < 26; i++) {
  47.             p = max(p, cnt[i]);
  48.             pos[i] = mp(cnt[i], sz(v[cnt[i]]));
  49.             v[cnt[i]].pb(i);
  50.         }
  51.         int l1 = 26, l2 = 26;
  52.         for(int i = 0; i < 26; i++) {
  53.             if(cnt[i] != 0) {
  54.                 if(l1 == 26) {
  55.                     l1 = i;
  56.                 }
  57.                 else if(l2 == 26) {
  58.                     l2 = i;
  59.                     break;
  60.                 }
  61.             }
  62.         }
  63.  
  64.         string res = "";
  65.         int lst = -1;
  66.  
  67.         for(int step = 0; step < sz(s); step++) {
  68.             if((sum & 1) && p * 2 > sum) { // ставим тот, которого больше
  69.                 int idx = v[p][0];
  70.                 if(idx >= 26 || cnt[idx] == 0) break;
  71.                 if(idx == lst) break;
  72.                 res += (idx + 'a');
  73.                 pos[idx] = mp(p - 1, sz(v[p-1]));
  74.                 v[p-1].pb(idx);
  75.                 v[p].pop_back();
  76.                 while(p >= 0 && sz(v[p]) == 0) p--;
  77.                 cnt[idx]--;
  78.                 if(cnt[idx] == 0) {
  79.                     if(idx == l1) {
  80.                         l1 = l2;
  81.                         l2++;
  82.                         while(l2 < 26 && cnt[l2] == 0) l2++;
  83.                     }
  84.                     else if(idx == l2) {
  85.                         while(l2 < 26 && cnt[l2] == 0) l2++;
  86.                     }
  87.                 }
  88.                 lst = idx;
  89.             }
  90.             else if(l1 != lst) {
  91.                 int idx = l1;
  92.                 if(idx >= 26 || cnt[idx] == 0) break;
  93.                 res += (idx + 'a');
  94.                 int pp = pos[idx].first;
  95.                 int ss = pos[idx].second;
  96.                 if(ss != sz(v[pp]) - 1) {
  97.                     int who = v[pp][sz(v[pp]) - 1];
  98.                     pos[who] = pos[idx];
  99.                     swap(v[pp][ss], v[pp][sz(v[pp])-1]);
  100.                 }
  101.                 v[pp].pop_back();
  102.                 pos[idx] = mp(pp-1, sz(v[pp-1]));
  103.                 v[pp-1].pb(idx);
  104.                 cnt[idx]--;
  105.                 while(p >= 0 && sz(v[p]) == 0) p--;
  106.                 if(cnt[idx] == 0) {
  107.                     l1 = l2;
  108.                     l2++;
  109.                     while(l2 < 26 && cnt[l2] == 0) l2++;
  110.                 }
  111.                 lst = idx;
  112.             }
  113.             else {
  114.                 int idx = l2;
  115.                 if(idx >= 26 || cnt[idx] == 0) break;
  116.                 res += (idx + 'a');
  117.                 int pp = pos[idx].first;
  118.                 int ss = pos[idx].second;
  119.                 if(ss != sz(v[pp]) - 1) {
  120.                     int who = v[pp][sz(v[pp]) - 1];
  121.                     pos[who] = pos[idx];
  122.                     swap(v[pp][ss], v[pp][sz(v[pp])-1]);
  123.                 }
  124.                 v[pp].pop_back();
  125.                 pos[idx] = mp(pp-1, sz(v[pp-1]));
  126.                 v[pp-1].pb(idx);
  127.                 cnt[idx]--;
  128.                 while(p >= 0 && sz(v[p]) == 0) p--;
  129.                 if(cnt[idx] == 0) {
  130.                     while(l2 < 26 && cnt[l2] == 0) l2++;
  131.                 }
  132.                 lst = idx;
  133.             }
  134.             sum--;
  135.         }
  136.  
  137.         if(sz(res) == sz(s)) {
  138.             puts(res.c_str());
  139.         }
  140.         else {
  141.             res = "IMPOSSIBLE";
  142.             puts(res.c_str());
  143.         }
  144.     }
  145.  
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement