module main; // 幅優先探索 import std; // C++ の tie auto tie(StoreElements...)(ref StoreElements stores) { alias Elements = staticMap!(Unqual, StoreElements); template toPointer(T) { alias toPointer = T*; } struct Holder { alias StoreElementsPtrs = staticMap!(toPointer, StoreElements); StoreElementsPtrs storePtrs; this(ref StoreElements stores) { foreach(i, _; StoreElements) { storePtrs[i] = &stores[i]; } } void opAssign(Tuple!Elements values) { foreach(i, _; Elements) { *storePtrs[i] = values[i]; } } } return Holder(stores); } void main() { // 入力 auto S = readln.chomp; long N = readln.chomp.to!long; auto T = readln.chomp; // 答えの計算と出力 if (S.count('o') != T.count('o') || (S == T && N & 1)) { writeln("SUCCESS"); return; } // 動かした手数、帽子の配置 alias P = Tuple!(int, string); auto que = DList!P(P(0, S)); while (!que.empty) { int n; string s; tie(n, s) = que.front; que.removeFront; if (s == T) { writeln("FAILURE"); return; } if (n < N) { que.insertBack(P(n + 1, "" ~ s[0] ~ s[2] ~ s[1])); que.insertBack(P(n + 1, "" ~ s[1] ~ s[0] ~ s[2])); } } writeln("SUCCESS"); }