调了2.5h实在调不出来。。。
#include<bits/stdc++.h>
#define ll int
using namespace std;
ll n,idx,f[300005][28],tot,e[30][30],in[30005],ed[30005],ok[30005];
ll vis[30005];
string ss[30005];
queue<ll> q;
ll getnum(char c)
{
return c-'a';
}
void build(string s)
{
ll p=0;
for(ll i=0;i<s.size();i++)
{
ll c=getnum(s[i]);
if(!f[p][c]) f[p][c]=++idx;
p=f[p][c];
}
ed[p]=1;
}
void toposort()
{
while(q.size()) q.pop();
for(ll i=0;i<26;i++)
{
if(!in[i])
{
//cout<<i<<" ";
q.push(i);
vis[i]=1;
}
}
while(!q.empty())
{
ll u=q.front();
q.pop();
for(ll i=0;i<26;i++)
{
if(!e[u][i]) continue;
in[i]--;
if(!in[i])
{
//cout<<i<<" ";
q.push(i);
vis[i]=1;
}
}
}
}
bool find(string s)
{
memset(e,0,sizeof e);
memset(in,0,sizeof in);
memset(vis,0,sizeof vis);
ll u=0;
for(ll i=0;i<s.size();i++)
{
if(ed[u]) return 0;
ll c=getnum(s[i]);
for(ll j=0;j<26;j++)
{
if(c!=j&&f[u][j]&&!e[c][j])
{
e[c][j]=1;
in[j]++;
}
}
u=f[u][c];
}
toposort();
// cout<<endl;
for(ll i=0;i<26;i++)
{
if(!vis[i]) return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>ss[i];
build(ss[i]);
}
for(ll i=1;i<=n;i++)
{
if(find(ss[i]))
{
tot++;
ok[tot]=i;
// cout<<i<<" "<<ok[tot]<<endl;
}
}
//cout<<endl;
cout<<tot<<endl;
for(ll i=1;i<=tot;i++) cout<<ss[ok[i]]<<endl;
}