問題の意味
https://vjudge.net/problem/CodeForces-1251C
隣接する奇数偶数の列の位置を交換することができない、他の隣接状況が最小数である表現する文字列を尋ねる、交換することができます。
思考
隣接する偶数、奇数の固定位置は、それが一緒に一緒に奇数、偶数プットを置くことが可能であり、これらの山は、マージソートすることができます。
コード
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 #define INF 0x3f3f3f3f の#define LL長い長 のconst int型N = 200005。 const int型MOD = 1E9 + 7。 constのダブルEPS = 1E-8; constのダブルPI = ACOS(-1.0); #define lowbit(X)(X&( - X)) LL GCD(-1,11,11- B){戻りB == 0:GCD(B、%のB);}? LL qpow(-1,11,11- B) {LL RES = 1;一方、(b)は、{(B&1)であれば、RES = RES *%のMOD; A = A *%のMOD; B >> = 1;}戻りRES;} LL INV(LL A、LL P ){戻りqpow(P-2);} int型のmain() { のstd :: IOS :: sync_with_stdio(偽)。 int型T; cinを>>トン。 一方、(t--) { 文字列s。 cinを>>秒; 文字列JI、OU。 INT L = s.length()。 以下のために(; I <L; INT iが0 = I ++) { IF((S [I] - '0')%2) JI + = S [i]は、 他の OU + = S [i]は、 } INT私がj = 0、李= ji.length()、LJ = ou.length()= 0。 一方、(I <LI && J <LJ) { IF(JI [I] <OU [J]) { COUT << JI [I]。 I ++; } 他 { COUT << OU [J]。 J ++; } } ながら(I <LI) COUT << JI [I ++]。 しばらく(J <LJ) coutの<<または[J ++]; coutの<<てendl; } 戻り0; }