codeforces 510C Fox And Names 拓扑排序

传送门:cf 510D

给定n个字符串,问能否存在这样的字母表,使得字符串的排序满足字典序。即依据新的字母表,排序满足字典序大小。

假设满足字典序,则我们可以依据已有的字符串得出各字母之间的大小关系,然后通过拓扑排序来判断是否存在可行解,输出任意解,因此只需要判断是否存在解即可。

/******************************************************
 * File Name:   a.cpp
 * Author:      kojimai
 * Create Time: 2015年02月03日 星期二 00时32分13秒
******************************************************/

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
#define FFF 105
char s[FFF][FFF],ans[30];
int in[FFF];
bool link[26][26];

queue<int> p;
bool solve() { // 通过拓扑排序判定是否存在可行解
	int cnt = 0;
	for(int i = 0;i < 26;i++) {
		if(in[i] == 0) {
			p.push(i);
			ans[cnt++] = 'a' + i;
		}
	}
	while(!p.empty()) {
		int now = p.front(); p.pop();
		for(int i = 0;i < 26;i++) {
			if(link[now][i]) {
				in[i]--;
				if(in[i] == 0) {
					p.push(i);
					ans[cnt++] = 'a' + i;
				}
			}
		}
	}
	ans[26] = '\0';
	if(cnt < 26)
		return false;
	else
		return true;
}

int main() {
	int n;
	cin >> n;
	for(int i = 0;i < n;i++)
		cin >> s[i];
	bool flag = true;
	memset(link,false,sizeof(link));
	memset(in,0,sizeof(in));
	for(int i = 0;i < n - 1 && flag;i++) {
		bool ok = false;
		int l1 = strlen(s[i]),l2 = strlen(s[i+1]);
		for(int j = 0;j < l1 && j < l2 && !ok;j++) {
			if(s[i][j] != s[i+1][j]) { //同一位置的字母不同,则字典序的大小可以比较出来了,即对应字母的相对大小可知
				ok = true;
				if(!link[s[i][j]-'a'][s[i+1][j]-'a']) {
					in[s[i+1][j]-'a']++;
					link[s[i][j]-'a'][s[i+1][j]-'a'] = true;
				}
			}
		}
		if(!ok && l1 > l2)
			flag = false;//某两个字符串前缀完全相同,但是第一个字符串长度较大,则两字符串必定不满足字典序
	}
	if(!flag) {
		printf("Impossible\n");
	}
	else {
		flag = solve();
		if(!flag)
			printf("Impossible\n");
		else
			printf("%s",ans);
	}
	return 0;
}
时间: 2024-10-05 21:03:16

codeforces 510C Fox And Names 拓扑排序的相关文章

codeforces 510C Fox And Names 拓扑

题意:n个姓名,按照某种"字典序". 问如果存在这样的字典序,输出字典序'a'到'z'26个字母的顺序. 思路:拓扑排序.对于str[i]和str[i+1]如果在位置k出现不同,那么x=str[i][k]-'a'+1,y=str[i+1][k]-'a'+1,从x->y连一条边,y的入度in[y]++. 然后拓扑排序,如果形成环,就说明不行,不然依次输出对应字符.(ps:len1为str[i]的长度,len2为str[i+1]的长度,如果len1>len2且前len2个均相同

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

C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: t

CF Fox And Names (拓扑排序)

Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: the

[CF #290-C] Fox And Names (拓扑排序)

题目链接:http://codeforces.com/contest/510/problem/C 题目大意:构造一个字母表,使得按照你的字母表能够满足输入的是按照字典序排下来. 递归建图:竖着切下来,将每个名字的第x个字母从上到下连接建图.然后求拓扑排序. 之所以要拓扑排序,因为要判断在x-1里面有a-->b  在x中有b-->a,这样就形成了一个环.这样一来,就不能够构造字母表了. [经验教训]:在递归建图的函数中开了两个数组,用来记录字母第一次出现和最后一次出现的位置..结果就RE在12上

(CodeForces 510C) Fox And Names 拓扑排序

题目链接:http://codeforces.com/problemset/problem/510/C 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.

Codeforces Round #290 (Div. 2) 拓扑排序

C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce: "Fox"). She heard a rumor: t

codeforce 510C Fox And Names

原题地址:http://codeforces.com/problemset/problem/510/C 题意: 给定一组字符串,要求找到一个字符排列,使得该字符串的排序满足字符序列对应地字典序 题解 拓扑排序…… #include<bits/stdc++.h> #define clr(x,y) memset((x),(y),sizeof(x)) using namespace std; typedef long long LL; const int maxn=300; int c[maxn+5

CodeForces 909E Coprocessor(无脑拓扑排序)

You are given a program you want to execute as a set of tasks organized in a dependency graph. The dependency graph is a directed acyclic graph: each task can depend on results of one or several other tasks, and there are no directed circular depende

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

题目链接:http://codeforces.com/problemset/problem/510/C C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer S