zoukankan      html  css  js  c++  java
  • Codeforces Round #290 (Div. 2) C. Fox And Names dfs

    C. Fox And Names

    题目连接:

    http://codeforces.com/contest/510/problem/C

    Description

    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.

    After checking some examples, she found out that sometimes it wasn't true. On some papers authors' names weren't sorted in lexicographical order in normal sense. But it was always true that after some modification of the order of letters in alphabet, the order of authors becomes lexicographical!

    She wants to know, if there exists an order of letters in Latin alphabet such that the names on the paper she is submitting are following in the lexicographical order. If so, you should find out any such order.

    Lexicographical order is defined in following way. When we compare s and t, first we find the leftmost position with differing characters: si ≠ ti. If there is no such position (i. e. s is a prefix of t or vice versa) the shortest string is less. Otherwise, we compare characters si and ti according to their order in alphabet.

    Input

    The first line contains an integer n (1 ≤ n ≤ 100): number of names.

    Each of the following n lines contain one string namei (1 ≤ |namei| ≤ 100), the i-th name. Each name contains only lowercase Latin letters. All names are different.

    Output

    If there exists such order of letters that the given names are sorted lexicographically, output any such order as a permutation of characters 'a'–'z' (i. e. first output the first letter of the modified alphabet, then the second, and so on).

    Otherwise output a single word "Impossible" (without quotes).

    Sample Input

    3

    rivest

    shamir

    adleman

    Sample Output

    bcdefghijklmnopqrsatuvwxyz

    Hint

    题意

    给你n个串,然后让你输出一个字符串,使得根据这个字符串的先后顺序排序的n个串

    和给你的顺序是一样的

    题解:

    每两个串相比较,只需要一对字符不一样

    记录一下是哪一对,然后再dfs一波就好了

    注意坑点:

    有可能两个串只有长度不一样

    形成环

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    string s[120];
    vector<int> G[30];
    int flag = 0;
    int ran[40];
    int vis[120],used[120];
    int tot = 0;
    void solve(int x)
    {
        for(int i=0;i<s[x].size()&&i<s[x+1].size();i++)
        {
            if(s[x][i]!=s[x+1][i])
            {
                G[s[x+1][i]-'a'].push_back(s[x][i]-'a');
                return;
            }
        }
        if(s[x+1].size()<s[x].size())
        {
            puts("Impossible");
            exit(0);
        }
    }
    void dfs(int x)
    {
        vis[x]=used[x]=1;
        for(int i=0;i<G[x].size();i++)
        {
            if(used[G[x][i]])
            {
                puts("Impossible");
                exit(0);
            }
            if(!vis[G[x][i]])
                dfs(G[x][i]);
        }
        used[x]=0;
        ran[tot++]=x;
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            cin>>s[i];
        for(int i=0;i<n-1;i++)
            solve(i);
        for(int i=0;i<26;i++)
        {
            memset(used,0,sizeof(used));
            if(!vis[i])
                dfs(i);
        }
        for(int i=0;i<26;i++)
            printf("%c",ran[i]+'a');
    }
  • 相关阅读:
    hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】
    poj3376 Finding Palindromes【exKMP】【Trie】
    hdu4763 Theme Section【next数组应用】
    hdu2609 How many【最小表示法】【Hash】
    hdu3374 String Problem【最小表示法】【exKMP】
    poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】
    python装饰器
    python面试题
    salt教程1-理解saltstack
    redis慢查询日志
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5077183.html
Copyright © 2011-2022 走看看