package chelper; import java.util.ArrayList; import java.util.Collections; import java.util.List; import io.InputReader; import io.OutputWriter; public class GroupedWord { public void solve(int testNumber, InputReader in, OutputWriter out) { int n = in.nextInt(); String[] a = in.nextStringArray(n); out.println(restore(a)); } String restore(String[] a) { List list = new ArrayList<>(); Collections.addAll(list, a); for (char c = 'a'; c <= 'z'; c++) { List interesting = new ArrayList<>(); for (int i = 0; i < list.size();) { if (list.get(i).contains("" + c)) { interesting.add(list.get(i)); list.remove(i); } else { i++; } } if (interesting.isEmpty()) { continue; } String result = combine(c, interesting); if (result == null) { return "IMPOSSIBLE"; } list.add(result); } if (list.size() > 1) { return "MANY"; } return list.get(0); } boolean isInvalid(String s) { for (int i = 0; i < s.length(); i++) { for (int j = i + 1; j < s.length(); j++) { if (s.charAt(i) == s.charAt(j) && s.charAt(i) != s.charAt(i + 1)) { return true; } } } return false; } String combine(char c, List interesting) { List only = new ArrayList<>(); List starts = new ArrayList<>(); List ends = new ArrayList<>(); List middle = new ArrayList<>(); for (String s : interesting) { if (isInvalid(s)) { return null; } boolean doesStart = s.charAt(0) == c; boolean doesEnd = s.charAt(s.length() - 1) == c; if (doesStart) { if (doesEnd) { only.add(s); } else { starts.add(s); } } else { if (doesEnd) { ends.add(s); } else { middle.add(s); } } } if (starts.size() > 1 || ends.size() > 1 || middle.size() > 1) { return null; } if (!middle.isEmpty()) { if (only.isEmpty() && starts.isEmpty() && ends.isEmpty()) { return middle.get(0); } else { return null; } } StringBuilder sb = new StringBuilder(); for (String s : ends) { sb.append(s); } for (String s : only) { sb.append(s); } for (String s : starts) { sb.append(s); } return sb.toString(); } }