关闭

[CodeForces 510C]Fox And Names[字典序][拓扑排序]

标签: 拓扑排序字典序
585人阅读 评论(0) 收藏 举报
分类:
题目链接:[CodeForces 510C]Fox And Names[字典序][拓扑排序]

题意分析:

给出n个人的名字字典序排名,问:能否根据这个给出一个满足要求的字典序顺序,如果不能,输出"Impossible"

解题思路:

直接根据字典序的比较方法来做题:

例如:

上方字符串:ssssscbc

下方字符串:sssssad

相邻两个字符串,从左到右进行比较,直到两个不相同的字符出现,此时给下方字符是上方字符的子节点,代表:上方字符字典序大于下方字符。即:c > a

注意如果上方为aaa下方为aa的情况,这种情况肯定是矛盾的,要特判下。

然后根据建立的图,拓扑排序一遍即可。

个人感受:

这题放着没做25天了,噗,因为OJ上那一场最后交题就是25天前23333。然后上周做了一道拓扑+并查的题,这题就有思路啦~

具体代码如下:

#include<cstdio>
#include<queue>
#define pr(x) cout << #x << " = " << (x) << '\n';
using namespace std;

const int INF = 0x7f7f7f7f;
const int MAXN = 111;

char name[MAXN][MAXN];
int in[MAXN];
bool vis[26]; // 记录哪个字母还没被排序过,这种就随意排了
vector<int> G[MAXN];

int main()
{
    int n; scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%s", name[i] + 1);
    for (int i = 0; i < 26; ++i) G[i].clear(), in[i] = 0, vis[i] = 0;
    bool imp = 0;
    --n;
    for (int i = 0; i < n; ++i) // 每次比较相邻两行字符串
    {
        for (int j = 1; j <= 100; ++j)
        {
            if (name[i][j - 1] != name[i + 1][j - 1]) break; // 向右移动直到两者不相同
            if (name[i][j] == 0) break;
            if (name[i + 1][j] == 0) // 不能发生两者前部分相同的情况下后面一个串长度短这种事
            {
                imp = 1; break;
            }
            if (name[i][j] == name[i + 1][j]) continue; // 继续向右移动
            G[name[i][j] - 'a'].push_back(name[i + 1][j] - 'a');
            ++in[name[i + 1][j] - 'a'];
        }
    }

    vector<char> ans;
    queue<int> q;
    int judge = 0;
    for (int i = 0; i < 26; ++i)
    {
        if (G[i].size()) ++judge;  // 统计需要拓扑点的个数
        if (!in[i] && G[i].size())
        {
            ans.push_back(i + 'a');
            vis[i] = 1;
            q.push(i);
        }
    }

    while (q.size())
    {
        int cur = q.front(); q.pop();
        --judge;
        for (int i = 0; i < G[cur].size(); ++i)
        {
            int v = G[cur][i];
            if (--in[v] == 0)
            {
                ans.push_back(v + 'a');
                vis[v] = 1;
                q.push(v);
            }
        }
    }

    if (judge > 0 || imp) printf("Impossible\n");
    else
    {
        for (int i = 0; i < ans.size(); ++i) printf("%c", ans[i]);
        for (int i = 0; i < 26; ++i) if (!vis[i]) printf("%c", i + 'a');
        printf("\n");
    }
    return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

hdoj 4857 逃生 【拓扑排序 输出字典序最小解】

逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-08-14 14:27
  • 1050

POJ 1270 Following Orders(拓扑排序:输出所有可能)

POJ 1270 Following Orders(拓扑排序:输出所有可能) http://poj.org/problem?id=1270 题意:输入数据有两行,第一行给你由26个单个小写字母表示的变...
  • u013480600
  • u013480600
  • 2014-06-12 22:09
  • 2009

hdu 拓扑排序 题目归纳

拓扑排序 定义和前置条件: 定义:将有向图中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面。 ...
  • Simon_coder
  • Simon_coder
  • 2016-06-01 17:57
  • 3329

Codeforces 510C Fox And Names 拓扑排序

传送门:510C C. Fox And Names time limit per test 2 seconds memory limit per test 2...
  • haoliang94
  • haoliang94
  • 2015-02-07 15:24
  • 639

Codeforces 510C Fox And Names【拓扑排序】

Fox And Names time limit per test  2 seconds memory limit per test  256 megabytes i...
  • mengxiang000000
  • mengxiang000000
  • 2016-08-15 23:30
  • 176

codeforces510C. Fox And Names【拓扑排序】

C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes ...
  • R1986799047
  • R1986799047
  • 2016-05-21 08:20
  • 282

codeforces 510C Fox And Names 拓扑排序

传送门:cf 510D 给定n个字符串,问能否存在这样的字母表,使得字符串的排序满足字典序。即依据新的字母表,排序满足字典序大小。 假设满足字典序,则我们可以依据已有的字符串得出各字母之间...
  • u010535824
  • u010535824
  • 2015-02-03 03:28
  • 910

Codeforces 510C - Fox And Names (拓扑排序)

RT
  • u014247806
  • u014247806
  • 2015-02-03 11:50
  • 703

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

CodeForces510 C. Fox And Names(拓扑排序)
  • u012860063
  • u012860063
  • 2015-02-03 21:29
  • 1073

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

思路:对相邻两行,当s1[i]≠s2[i]时,新的字母表中s1[i]必须出现在s2[i]的前面,显然是拓扑排序。所以枚举相邻的两行,构造有向边统计入度。 拓扑排序: 每次从图中拿走一个入度为0的节点,...
  • ww32zz
  • ww32zz
  • 2015-08-03 15:28
  • 308
    个人资料
    • 访问:105816次
    • 积分:3267
    • 等级:
    • 排名:第12059名
    • 原创:228篇
    • 转载:8篇
    • 译文:0篇
    • 评论:29条
    联系我:
    最新评论