[CodeForces 510C]Fox And Names[字典序][拓扑排序]
来源:互联网 发布:淘宝网店怎么加盟代理 编辑:程序博客网 时间:2024/06/11 10:59
题目链接:[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
- [CodeForces 510C]Fox And Names[字典序][拓扑排序]
- codeforces 510C Fox And Names 拓扑排序
- Codeforces 510C - Fox And Names (拓扑排序)
- Codeforces 510C Fox And Names 拓扑排序
- codeforces 510c Fox And Names 拓扑排序
- Codeforces 510C Fox And Names 拓扑排序
- [CodeForces] 510 C Fox And Names [拓扑排序]
- 拓扑排序 CodeForces - 510C Fox And Names
- Codeforces 510C Fox And Names【拓扑排序】
- codeforces 510C Fox And Names 拓扑
- [拓扑] Codeforces #510C. Fox And Names
- Codeforces 510C Fox And Names 拓扑序+判环
- 拓扑排序 Fox And Names : CodeForces
- 【CodeForces】510C - Fox And Names(拓扑 & STL)
- CF 510C(Fox And Names-拓扑排序)
- 510C Fox And Names(拓扑排序)
- CF 510C Fox And Names(拓扑排序)
- CF 510C Fox And Names【拓扑排序】
- 如何编程实现二维图形的旋转
- 中文pppoe中文拨号的解决方案
- hdu 1106 排序
- 查看windows系统中的程序运行记录
- 折线图(四)计算坐标轴文字大小,确定准确位置
- [CodeForces 510C]Fox And Names[字典序][拓扑排序]
- Windows下error LNK2019: 无法解析的外部符号 __imp__select@20
- nginx配置拒绝直接访问js文件
- 最小拦截系统Hdu1257 dp
- angular指令中scope三个符号的说明
- 多核计算与并发编程 语言篇
- 2015 南阳 CCPC hdu 5546 Ancient Go(DFS,暴力)
- Window下memcached安装与测试步骤
- 第1章 ビッグデータとデータの活用