题意
给定n个字符串,判断是否能给出一个新的字典序规则使得这n个字符串满足字典序排序
思路
等价建图后判断该图是否为拓扑图
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Stack;
public class C {
static final int N = 110;
int n;
String[] s = new String[N];
public static void main(String[] args) throws IOException {
C c = new C();
c.read();
c.solve();
}
/**
* 7
* car
* care
* careful
* carefully
* becarefuldontforgetsomething
* otherwiseyouwillbehacked
* goodluck
*/
/**
* 2
* aa
* a
*/
private void solve() {
// 拓扑图
// 建图 100 * 100 * 100
boolean[][] g = new boolean[26][26];
int[] in = new int[26];
HashSet<Character> st = new HashSet<>();
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
// 如果存在s[j] 是 s[i] 的前缀,则不成立
if(s[i].startsWith(s[j]) && s[i].length() > s[j].length()) {
System.out.println("Impossible");
return ;
}
for(int k = 0; k < s[i].length() && k < s[j].length(); k++) {
// 从s[i][k] 到 s[j][k] 的边
if(s[i].charAt(k) != s[j].charAt(k)) {
if(g[s[i].charAt(k) - 'a'][s[j].charAt(k) - 'a']) break;
g[s[i].charAt(k) - 'a'][s[j].charAt(k) - 'a'] = true;
in[s[j].charAt(k) - 'a']++;
st.add(s[i].charAt(k));
st.add(s[j].charAt(k));
break;
}
}
}
}
StringBuffer res = new StringBuffer();
Stack<Integer> stack = new Stack<>();
for(int i = 0; i < 26; i++) {
if(in[i] == 0) {
stack.push(i);
}
}
while (stack.size() > 0) {
Integer u = stack.peek();
stack.pop();
res.append((char)('a' + u));
for(int v = 0; v < 26; v++) {
if(g[u][v] && (--in[v] == 0)) {
stack.push(v);
}
}
}
// 判断是否形成拓扑图
if(res.length() == 26) {
System.out.print(res.toString());
} else {
System.out.println("Impossible");
}
}
private void read() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
for(int i = 0; i < n; i++) {
s[i] = br.readLine();
}
}
}