题目大意:给定一个数字n, 输入n个字符串,根据字符串的顺序得出题目的字典序,比如第一个字符串为abef 第二个字符串为abdf, 则e的字典序在d之前。如果字符串中没有给定的字母,按a~z的顺序。最后输出题目中二十六个英文字母的字典序。
解题思路:每个字符串进行逐个比较,找到两个字符串的不同的字母,将两个节点链接,形成一个有向图,然后拓扑排序。需要注意的是没出现的字母怎么处理,我是如果没有前项就输出字典序最小的。用优先队列实现。或者一个大神逆向进行拓扑也可以;
AC代码:
#include <iostream>
#include <cstdio>
#include <map>
#include <queue>
#include <cstring>
using namespace std;
int Link[27][27];
int rd[126];
char tp[26];
bool topo()
{
int ans = 0;
priority_queue<int, vector<int>, greater<int> > que;
for(int i=0; i<26; i++) if(!rd[i]) que.push(i);
while(!que.empty())
{
int v = que.top(); que.pop();