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];
int topo[maxn+5];
int cnt;

vector <int> G[maxn+5];
char Name[105][105];

bool dfs(int u)
{
    c[u]=-1;
    for (int i=0;i<G[u].size();++i)
    {
        int v=G[u][i];
        if (c[v]<0) return false;
        else if (!c[v] && !dfs(v)) return false;
    }
    c[u]=1;
    topo[--cnt]=u;
    return true;
}

bool toposort(int n)
{
    cnt=n;
    clr(c,0);
    for (int u=0;u<n;++u)
    {
        if (!c[u] && !dfs(u)) return false;
    }
    return true;
}

int main(void)
{
    #ifdef ex
    freopen ("../in.txt","r",stdin);
    //freopen ("../out.txt","w",stdout);
    #endif

    int n;
    scanf("%d",&n);

    for (int i=1;i<=n;++i)
    {
        scanf("%s",Name[i]);
    }

    for (int i=1;i<=n-1;++i)
    {
        int len1=strlen(Name[i]);
        int len2=strlen(Name[i+1]);
        for (int j=0;j<min(len1,len2);++j)
        {
            int t1=Name[i][j]-‘a‘;
            int t2=Name[i+1][j]-‘a‘;
            if (t1!=t2)
            {
                G[t1].push_back(t2);
                //printf("%c %c\n",Name[i][j],Name[i+1][j]);
                break;
            }
            if (len1>len2 && j==min(len1,len2)-1)
            {
                printf("Impossible\n");
                return 0;
            }
        }
    }

    bool f=toposort(26);
    if (!f)
        printf("Impossible\n");
    else
    {
        for (int i=0;i<26;++i)
            printf("%c",topo[i]+‘a‘);
    }
}
时间: 2024-12-09 05:19:53

codeforce 510C Fox And Names的相关文章

codeforces 510C Fox And Names 拓扑排序

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

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个均相同

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

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

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

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 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上

#290 (div.2) C. Fox And Names

1.题目描述:点击打开链接 2.解题思路:本题利用拓扑排序解决.本题要求出一个a~z的排列,使得所有名字按照这样的"字典序"是逐渐增加的.显然这里存在着字母之间的大小关系,容易联想到拓扑排序. 那么该如何来排序呢?先思考一下简单的情况,假设姓名s,t是相邻的两个名字,如果s是t的一个前缀,那么跳过即可:反之如果t是s的前缀,那么肯定是无解的.如果不是以上这种情况,那么首个不相同的位置处的两个字母就可以连一条边,最终构建出一个有向图.最后利用拓扑排序的模板,为26个英文字母从后向前排序即