Codeforces Round #290 (Div. 2) - C. Fox And Names (拓扑排序)
2015-08-27 20:16
302 查看
题目:
http://codeforces.com/problemset/problem/510/C
题意:
题目给出的单词按照字典序排列,求出符合这些排列的 26个字母的排列。
思路:
拓扑排序。
AC.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
char s[105][105];
int in[105], ou[105];
int tol, head[105];
struct Edge{
int to, next;
}edge[5000];
void addedge(int u, int v)
{
edge[tol].to = v;
edge[tol].next = head[u];
head[u] = tol++;
}
vector<int> vec;
void tuopu()
{
vec.clear();
queue<int> que;
for(int i = 0; i <= 25; ++i) {
if(!ou[i]) que.push(i);
}
while(!que.empty()) {
int u = que.front(); que.pop();
vec.push_back(u);
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
ou[v]--;
if(ou[v] == 0) que.push(v);
}
}
if(vec.size() < 26) {
printf("Impossible\n");
return;
}
for(int i = vec.size()-1; i >= 0; --i) {
char ch = vec[i] + 'a';
printf("%c", ch);
}
printf("\n");
}
void init()
{
tol = 0;
memset(head, -1, sizeof(head));
memset(in, 0, sizeof(in));
memset(ou, 0, sizeof(ou));
}
int main()
{
//freopen("in", "r", stdin);
int n;
while(~scanf("%d", &n)) {
init();
int ok = 1;
for(int i = 0; i < n; ++i) {
scanf("%s", s[i]);
for(int j = 0; j < i; ++j) {
int s1 = strlen(s[i]), s2 = strlen(s[j]);
int p1 = 0, p2 = 0;
while(s[i][p1] == s[j][p2] && p1 < s1 && p2 < s2) {
p1++; p2++;
}
if(p1 == s1 && p2 != s2) ok = 0;
if(p1 != s1 && p2 != s2) {
int u = s[i][p1] - 'a', v = s[j][p2] - 'a';
addedge(u, v);
in[u]++;
ou[v]++;
}
}
}
if(!ok) printf("Impossible\n");
else
tuopu();
}
return 0;
}
http://codeforces.com/problemset/problem/510/C
题意:
题目给出的单词按照字典序排列,求出符合这些排列的 26个字母的排列。
思路:
拓扑排序。
AC.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
char s[105][105];
int in[105], ou[105];
int tol, head[105];
struct Edge{
int to, next;
}edge[5000];
void addedge(int u, int v)
{
edge[tol].to = v;
edge[tol].next = head[u];
head[u] = tol++;
}
vector<int> vec;
void tuopu()
{
vec.clear();
queue<int> que;
for(int i = 0; i <= 25; ++i) {
if(!ou[i]) que.push(i);
}
while(!que.empty()) {
int u = que.front(); que.pop();
vec.push_back(u);
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].to;
ou[v]--;
if(ou[v] == 0) que.push(v);
}
}
if(vec.size() < 26) {
printf("Impossible\n");
return;
}
for(int i = vec.size()-1; i >= 0; --i) {
char ch = vec[i] + 'a';
printf("%c", ch);
}
printf("\n");
}
void init()
{
tol = 0;
memset(head, -1, sizeof(head));
memset(in, 0, sizeof(in));
memset(ou, 0, sizeof(ou));
}
int main()
{
//freopen("in", "r", stdin);
int n;
while(~scanf("%d", &n)) {
init();
int ok = 1;
for(int i = 0; i < n; ++i) {
scanf("%s", s[i]);
for(int j = 0; j < i; ++j) {
int s1 = strlen(s[i]), s2 = strlen(s[j]);
int p1 = 0, p2 = 0;
while(s[i][p1] == s[j][p2] && p1 < s1 && p2 < s2) {
p1++; p2++;
}
if(p1 == s1 && p2 != s2) ok = 0;
if(p1 != s1 && p2 != s2) {
int u = s[i][p1] - 'a', v = s[j][p2] - 'a';
addedge(u, v);
in[u]++;
ou[v]++;
}
}
}
if(!ok) printf("Impossible\n");
else
tuopu();
}
return 0;
}
相关文章推荐
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- Codeforces Round #265 (Div. 2)
- Codeforces #310 div2 C. Case of Matryoshkas
- 状态压缩DP codeforces 244 Problem C. The Brand New Function 和 codeforces 165 E. Compatible Numbers
- codeforces 16 Problem E fish
- Codeforces round #247 for Div. 2
- Codeforces Round #246 (Div. 2)
- Codeforces #264(div 2)D.Gargari and Permutations
- Codeforces Round #236 (Div. 2)------A,B
- codeforces 257 div2 B
- Codeforces Gym100571A Cursed Query
- Codeforces Gym100342E Minima
- Codeforces Gym100342J Triatrip
- Codeforces Gym100286B Blind Walk (dfs)
- Codeforces Gym100342J Triatrip