模板Trie,结果样例没过。。。。。。
#include<bits/stdc++.h>
using namespace std;
int n,cnt;
string str[30010];
set<string> st;
int nxt[300010][26];
bool vis[300010],a[26][26];
void inser(string s){
int p=0;
for(int i=0;i<s.length();i++){
int c=s[i]-'a';
if(!nxt[p][c]) nxt[p][c]=++cnt;
p=nxt[p][c];
}
vis[p]=1;
}
void dfs(int now,string go){
if(vis[now]) st.insert(go);
else{
for(int i=0;i<26;i++){
if(nxt[now][i]){
bool flag=0;
for(int j=0;j<26;j++){
if(i!=j&&nxt[now][j]&&a[j][i]){
flag=1;
break;
}
}
if(flag) continue;
for(int j=0;j<26;j++){
if(i!=j&&nxt[now][j]) a[i][j]=1;
}
dfs(nxt[now][i],go+char(i+'a'));
for(int j=0;j<26;j++){
if(i!=j&&nxt[now][j]) a[i][j]=0;
}
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>str[i];
inser(str[i]);
}
dfs(0,"");
printf("%d\n",st.size());
for(int i=1;i<=n;i++){
if(st.count(str[i])) cout<<str[i]<<endl;
}
return 0;
}