#include #include #include #define foreach(T,p,c) for(T p = (c).begin(); p != (c).end(); p++) using namespace std; string get_string(string &c, int s, int i, int n) { string p = ""; string::iterator ptr = c.begin() + s; int j = 0; while(true) { p += string(1, *ptr); *ptr = '_'; if(++j >= n) break; for(int k = 0; k <= i; k++) { while(true) { ++ptr; if(ptr == c.end()) ptr = c.begin(); if(*ptr != '_') break; } } } return p; } bool examine(string c, string p, int s, int i, int n) { string::iterator ptr = c.begin() + s; int j = 0; while(true) { if(*ptr != p[j]) return false; *ptr = '_'; if(++j >= n) return true; for(int k = 0; k <= i; k++) { while(true) { ++ptr; if(ptr == c.end()) ptr = c.begin(); if(*ptr != '_') break; } } } } string decrypt(string c) { int m = c.length(); string p = ""; for(int n = m / 2; p.empty(); n--) { for(int s = 1; s < m; s++) { for(int i = 1; i < m; i++) { string w = c; string q = get_string(w, s, i, n); if(p == q) continue; bool flag = false; for(int t = 1; !flag && t < m; t++) { if(c[s] != c[t]) continue; for(int j = i + 1; !flag && j < m; j++) { flag = examine(w, q, t, j, n); } } if(flag) { if(!p.empty()) return ""; p = q; } } } } return p; } int main(void) { ifstream cin("insecure.in"); int i = 0; string s; while(getline(cin, s)) { if(s == "X") break; string t = decrypt(s); cout << "Code " << (++i) << ": " << (t == "" ? "Codeword not unique" : t) << endl; } return 0; }