分析
- 由 题目所处的位置可判断要应用拓扑排序
(废话) - 难度主要在于如何比较字典序,注意比较相邻两单词第一个不相同的字母即可
- 输出0的情况:
1 存在环
2 字典不完整(找不到对应字母)
#include <bits/stdc++.h>
using namespace std;
int n,tot;
int f[30],G[30][30],v[30],res[30],h[30];
string s[50010];
stack<int> r;
int main()
{
memset(f,0x3f,sizeof(f));
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<n;i++){
if(s[i]==s[i+1])
continue;
if(s[i+1].find(s[i])==0)
continue;
if(s[i].find(s[i+1])==0){
puts("0");
return 0;
}
int x=0;
while(s[i][x]==s[i+1][x])
x++;
int a=s[i][x]-'a'+1,b=s[i+1][x]-'a'+1;
if(G[b][a]){
puts("0");
return 0;
}
G[a][b]=1;
if(!v[a]) v[a]=1,f[a]=0;
if(!v[b]) v[b]=1,f[b]=1;
else f[b]++;
}
memset(v,0,sizeof(v));
for(int i=1;i<30;i++)
if(!f[i])
r.push(i),v[i]=1;
while(r.size()) {
int x=r.top(); r.pop();
res[++tot]=x;
for(int i=1;i<30;i++) {
if(G[x][i]) f[i]--;
if(!f[i]&&!v[i])
r.push(i),v[i]=1;
}
}
for(int i=1;i<=tot;i++)
h[res[i]]=i;
string que,ans;
cin>>que;
for(int i=0;i<que.length();i++) {
if(!h[que[i]-'a'+1]){
puts("0");
return 0;
}
ans+=(char)(h[que[i]-'a'+1]+'a'-1);
}
cout<<ans<<endl;
return 0;
}