git reimport
This commit is contained in:
115
archive/2016.08/2016.08.04 - unsorted/GroupedWord.java
Normal file
115
archive/2016.08/2016.08.04 - unsorted/GroupedWord.java
Normal file
@@ -0,0 +1,115 @@
|
||||
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<String> list = new ArrayList<>();
|
||||
Collections.addAll(list, a);
|
||||
|
||||
for (char c = 'a'; c <= 'z'; c++) {
|
||||
List<String> 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<String> interesting) {
|
||||
List<String> only = new ArrayList<>();
|
||||
List<String> starts = new ArrayList<>();
|
||||
List<String> ends = new ArrayList<>();
|
||||
List<String> 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();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user