codeforces 510C Fox And Names 拓扑

题意:n个姓名,按照某种“字典序”。

问如果存在这样的字典序,输出字典序‘a‘到‘z’26个字母的顺序。

思路:拓扑排序。对于str[i]和str[i+1]如果在位置k出现不同,那么x=str[i][k]-‘a‘+1,y=str[i+1][k]-‘a‘+1,从x->y连一条边,y的入度in[y]++。

然后拓扑排序,如果形成环,就说明不行,不然依次输出对应字符。(ps:len1为str[i]的长度,len2为str[i+1]的长度,如果len1>len2且前len2个均相同,也说明不行)详见代码:

/*********************************************************
  file name: codeforces510C.cpp
  author : kereo
  create time:  2015年02月03日 星期二 16时03分28秒
*********************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int sigma_size=26;
const int N=100+50;
const int MAXN=100000+50;
const int inf=0x3fffffff;
const double eps=1e-8;
const int mod=100000000+7;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define PII pair<int, int>
#define mk(x,y) make_pair((x),(y))
int n,edge_cnt;
char str[N][N];
int head[N],in[N],ans[N],vis[N][N];
struct Edge{
    int v,next;
}edge[N];
void init(){
    edge_cnt=0;
    memset(in,0,sizeof(in));
    memset(vis,0,sizeof(vis));
    memset(head,-1,sizeof(head));
}
void addedge(int u,int v){
    edge[edge_cnt].v=v;
    edge[edge_cnt].next=head[u]; head[u]=edge_cnt++;
}
int main(){
    while(~scanf("%d",&n)){
        init();
        for(int i=0;i<n;i++)
            scanf("%s",str[i]);
        int flag=1;
        for(int i=0;i<n-1;i++){
            int len1=strlen(str[i]),len2=strlen(str[i+1]);
            int tag=0;
            for(int j=0;j<len1 && j<len2;j++){
                if(str[i][j]!=str[i+1][j]){
                    tag=1;
                    int u=str[i][j]-'a'+1,v=str[i+1][j]-'a'+1;
                    if(!vis[u][v]){
                        vis[u][v]=1; in[v]++; addedge(u,v);
                    }
                    break;
                }
            }
            if(!tag && len1>len2){
                flag=0;
                break;
            }
        }
        if(!flag){
            printf("Impossible\n");
            continue;
        }
        int cnt=0;
        queue<int>Q;
        while(!Q.empty()){
            Q.pop();
        }
        for(int i=1;i<=sigma_size;i++)
            if(!in[i])
                Q.push(i);
        while(!Q.empty()){
            int u=Q.front(); Q.pop();
            ans[cnt++]=u-1;
            for(int i=head[u];i!=-1;i=edge[i].next){
                int v=edge[i].v;
                --in[v];
                if(!in[v])
                    Q.push(v);
            }
        }
        if(cnt != sigma_size)
            printf("Impossible\n");
        else{
            for(int i=0;i<sigma_size;i++)
                printf("%c",'a'+ans[i]);
            printf("\n");
        }
    }
	return 0;
}
时间: 2024-07-30 23:52:30

codeforces 510C Fox And Names 拓扑的相关文章

codeforces 510C Fox And Names 拓扑排序

传送门:cf 510D 给定n个字符串,问能否存在这样的字母表,使得字符串的排序满足字典序.即依据新的字母表,排序满足字典序大小. 假设满足字典序,则我们可以依据已有的字符串得出各字母之间的大小关系,然后通过拓扑排序来判断是否存在可行解,输出任意解,因此只需要判断是否存在解即可. /****************************************************** * File Name: a.cpp * Author: kojimai * Create Time: 2

Codeforces Round #290 (Div. 2) C. Fox And Names 拓扑排序

C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: t

CF Fox And Names (拓扑排序)

Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the

(CodeForces 510C) Fox And Names 拓扑排序

题目链接:http://codeforces.com/problemset/problem/510/C Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the authors list on the paper is always sorted in the lexicographical order.

[CF #290-C] Fox And Names (拓扑排序)

题目链接:http://codeforces.com/contest/510/problem/C 题目大意:构造一个字母表,使得按照你的字母表能够满足输入的是按照字典序排下来. 递归建图:竖着切下来,将每个名字的第x个字母从上到下连接建图.然后求拓扑排序. 之所以要拓扑排序,因为要判断在x-1里面有a-->b  在x中有b-->a,这样就形成了一个环.这样一来,就不能够构造字母表了. [经验教训]:在递归建图的函数中开了两个数组,用来记录字母第一次出现和最后一次出现的位置..结果就RE在12上

codeforce 510C Fox And Names

原题地址:http://codeforces.com/problemset/problem/510/C 题意: 给定一组字符串,要求找到一个字符排列,使得该字符串的排序满足字符序列对应地字典序 题解 拓扑排序…… #include<bits/stdc++.h> #define clr(x,y) memset((x),(y),sizeof(x)) using namespace std; typedef long long LL; const int maxn=300; int c[maxn+5

CodeForces510 C. Fox And Names(拓扑排序)

题目链接:http://codeforces.com/problemset/problem/510/C C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer S

C. Fox And Names Codeforces Round #290 (Div. 2)

C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: t

Codeforces Round #290 (Div. 2) 拓扑排序

C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: t