洛谷P3065
筱柒Littleseven
QQ:3534947775
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define maxn 300010
#define maxm 30010
using namespace std;
struct Trie{int nex[27],num;}trie[maxn];
int tot=0,n,cnt,in[maxm];
string c[maxm],ans[maxm];
vector <int> v[27];
void insert(string s)
{
int now=0,len=s.length();
for(int i=0;i<len;i++)
{
int ch=s[i]-'a';
if(!trie[now].nex[ch]) trie[now].nex[ch]=++tot;
now=trie[now].nex[ch];
}
trie[now].num++;
}
int topo(string s)
{
int now=0,len=s.length();
for(int i=0;i<len;i++)
{
int ch=s[i]-'a';
if(trie[now].num) return 0;
for(int j=0;j<26;j++)
{
if(trie[now].nex[j]&&j!=ch)
{
v[ch].push_back(j);
in[j]++;
}
}
now=trie[now].nex[ch];
}
queue <int> q;
for(int i=0;i<26;i++){if(!in[i]) q.push(i);}
while(!q.empty())
{
int head=q.front(); q.pop();
for(int i=0;i<v[head].size();i++)
{
in[v[head][i]]--;
if(!in[v[head][i]]) q.push(v[head][i]);
}
}
for(int i=0;i<26;i++){if(in[i]) return 0;}
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++){cin>>c[i]; insert(c[i]);}
for(int i=1;i<=n;i++)
{
memset(in,0,sizeof in);
for(int j=0;j<27;j++) v[j].clear();
if(topo(c[i])) ans[++cnt]=c[i];
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++) cout<<ans[i]<<endl;
return 0;
}