#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; void stronglyConnectedComponents( const vector >& edges, vector& indexConvert, vector >& nodesOut) { const int n = edges.size(); vector num(n, -1), low(n, -1); vector isStk(n, false); stack stk; int cnt = -1; nodesOut.clear(); for(int i=0; i > arg; arg.push(make_pair(i, 0)); while(!arg.empty()){ int v = arg.top().first; unsigned j = arg.top().second; arg.pop(); if(j == 0){ if(num[v] != -1) continue; num[v] = low[v] = ++ cnt; stk.push(v); isStk[v] = true; } else{ int w = edges[v][j-1]; if(isStk[w]) low[v] = min(low[v], low[w]); } if(j < edges[v].size()){ arg.push(make_pair(v, j + 1)); int w = edges[v][j]; arg.push(make_pair(w, 0)); } else if(low[v] == num[v]){ nodesOut.push_back(vector()); for(;;){ int w = stk.top(); stk.pop(); isStk[w] = false; nodesOut.back().push_back(w); if(v == w) break; } } } } reverse(nodesOut.begin(), nodesOut.end()); // DAGにするために反転させる const int m = nodesOut.size(); indexConvert.resize(n); for(int i=0; i >& v, vector& ans) { vector > edges(2*n); for(unsigned i=0; i indexConvert; vector > nodes; stronglyConnectedComponents(edges, indexConvert, nodes); ans.resize(n); for(int i=0; i> n; if(n > 52){ cout << "Impossible" << endl; return 0; } vector u(n); for(int i=0; i> u[i]; vector > v; for(int a=0; a s; s.insert(u[a].substr(0, i+1)); s.insert(u[a].substr(i+1)); s.insert(u[b].substr(0, j+1)); s.insert(u[b].substr(j+1)); if(s.size() < 4){ v.push_back(make_pair(a, i==0)); v.push_back(make_pair(b, j==0)); } } } } } vector ans; if(!is2sat(n, v, ans)){ cout << "Impossible" << endl; return 0; } for(int i=0; i