[拓扑] Codeforces #510C. Fox And Names

sb题。直接建出大小关系然后拓扑。

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105,maxe=105;
int n,m,len[maxn],d[maxn],res[maxn];
int fir[maxn],nxt[maxe],son[maxe],tot;
char st[105][105];
void add(int x,int y){
    son[++tot]=y; nxt[tot]=fir[x]; fir[x]=tot;
    d[y]++; 
}
queue<int> Q;
int main(){
//  freopen("cf510C.in","r",stdin);
//  freopen("cf510C.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%s",st[i]+1), len[i]=strlen(st[i]+1); 
    for(int i=1;i<=n-1;i++){
        bool pd=false;
        for(int j=1;j<=len[i]&&j<=len[i+1]&&!pd;j++) 
         if(st[i][j]!=st[i+1][j]) pd=true, add(st[i][j]-'a'+1,st[i+1][j]-'a'+1);
        if(!pd&&len[i]>len[i+1]) return puts("Impossible\n"), 0; 
    }
    for(int i=1;i<=26;i++) if(!d[i]) Q.push(i);
    while(!Q.empty()){
        int x=Q.front(); Q.pop();
        res[++res[0]]=x;
        for(int j=fir[x];j;j=nxt[j]) if((--d[son[j]])==0) Q.push(son[j]); 
    }
    if(res[0]<26) puts("Impossible\n"); else{
        for(int i=1;i<=26;i++) putchar('a'-1+res[i]);
    }
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值