Fox And Names CodeForces - 510C
Posted 0211ji
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fox And Names CodeForces - 510C相关的知识,希望对你有一定的参考价值。
题意:新定义题,重新定义了字典序的概念( 即 a不一定小于b),已的n个单词是按 新字典序 从小到大排序的,求重新定义字典序的字母顺序。如果先后有矛盾输出 “Impossible”。
思路:先把前缀一致的过滤,剩下将路径存入数组,并记录每个字母的入度;
最后拓扑排序:若是不按照26原始字母顺序来,可以直接先将入度为0的全部放入队列并记录答案p[t++],再对队列里的字母开始出队且删除与之有关的边,若删除后,那个字母的入度为0,则可进入队列,答案p[t++],若入度不为0,则不操作。最后若答案长度小于26,说明有环,否则成功输出p数组。
1 #include<iostream> 2 #include<algorithm> 3 #include<queue> 4 #include<stack> 5 #include <bitset> 6 #include<set> 7 #include<map> 8 #include<unordered_map> 9 #include<vector> 10 #include<cmath> 11 #include<string> 12 #include<string.h> 13 using namespace std; 14 typedef long long ll; 15 typedef pair<ll, int> pa; 16 typedef unsigned long long ull; 17 char s[105][105]; 18 int f[50], mapp[50][50], len[105]; 19 char p[1001];//存储拓扑排序结果; 20 void tp() { 21 int i, j, t = 0; 22 queue<int>q; 23 for (i = 0; i < 26; i++){//从小到大找出全部入度为0的字母 24 if (!f[i]){ 25 q.push(i); 26 p[t++] = i + ‘a‘; 27 } 28 } 29 while (!q.empty()){//进行拓扑排序 30 int k = q.front(); 31 q.pop(); 32 for (i = 0; i < 26; i++){ 33 if (mapp[k][i] == 1){ 34 f[i]--; 35 if (f[i] == 0){//直到入度为0才可以进去队列 36 q.push(i); 37 p[t++] = i + ‘a‘; 38 } 39 } 40 } 41 } 42 if (t < 26){ 43 printf("Impossible "); 44 } 45 else{ 46 p[t] = ‘