集训考试题(CF510C Fox And Names的简化版)
题目描述
给定n个由小写字母组成的字符串,请你求出一个字母表顺序,使得这n个字符串是按照字典序升序排列的,数据保证存在合法的字母表顺序。
如果存在多个解,输出字典序最小的那个。
输入格式
第一行一个整数n.接下来n行,每行一个字符串。
输出格式
一行,一个a到z各出现一次的字符串,表示字母表顺序 。
样例读入:
10
petr
egor
endagorion
feferivan
ilovetanyaromanova
kostka
dmitriyh
maratsnowbear
bredorjaguarturnik
cgyforever
样例输出:
aghjlnopefikdmbcqrstuvwxyz
先水一下在考场上的骗分思路:
可以发现的是,非常有意思的,把所有的字符串的首字母提取出来,以样例为例,也就是:
peefikdmbc
去重后就是:
pefikdmbc
然后发现它在样例输出里存在,接着又发现,把其他的,没有在这个小串里出现的字幕按照正常的字母表顺序接在这个小串两边,就凑出了样例,
前半段自然是好凑,而后半段,我们则直接输出这个小串的首字母,也就是p,在字母表后没有出现的字母堆在后面,就凑出了样例:
前半段自然是:aghjlno
后半段自然是:qrstuvwxyz
然后我们就得到了样例输出:aghjlnopefikdmbcqrstuvwxyz
然后可能是存在某种正确性,但是一般不是字典序最小,但是我依旧骗到了大量的部分分
接着我们讲正解思路:
我们想要使得字符串的顺序有一个优先级,就意味着最基本的,他们的首字母有一个优先级
然后要是上下两个字符串的前半部分相等,那么就可以确定这之后的头一个字母的优先级
然后我们假设在一张图上优先级低的指向了优先级高的,也就是建立了一个拓扑序
我们根据拓扑序确定一个顺序。
优先级低的指向优先级高的,也就是将优先级高的的字母的入读加一
先将所有入度为0的存入答案数组,再按照拓扑序记录答案,最后输出即可
因为题目保证了一定合法,所以我们可以不考虑不合法的情况,但是如果一定有不合法的情况,我们判断也很简单
1.若两个字符串,一个字符串能够在另一个字符串中找到,且较长的字符串在短的字符串的上面,这是显然不合法的
2.若最后拓扑结束后,答案数组里存的字母不到26个,显然是不合法的
#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
int n, top = ;
char s[maxn][maxn], ans[maxn];
int in[maxn], lin[maxn][maxn];//lin表示两个字符串连接一条边bulabulabula
bool flag = ; inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return x * y;
} queue<int> q;
inline bool topsort_solve() {
for(int i = ; i < ; ++i)
if(!in[i]) {
q.push(i);
ans[++top] = char(i + 'a');
}
while(!q.empty()) {
int k = q.front(); q.pop();
for(int i = ; i < ; ++i)
if(lin[k][i]) {
in[i]--;
if(!in[i]) {
ans[++top] =char(i + 'a');
q.push(i);
}
}
}
if(top < ) return ;
else return ;
} int main() {
memset(in, , sizeof(in));
memset(lin, , sizeof(lin));
n = read();
for(int i = ; i < n; ++i)
cin >> s[i];
for(int i = ; i < n - ; ++i) {
int len1 = strlen(s[i]);
int len2 = strlen(s[i + ]);
int j = ;
while(j < len1 && j < len2 && s[i][j] == s[i + ][j]) j++;
if(j < len1 && j < len2) {
if(!lin[s[i][j] - 'a'][s[i + ][j] - 'a']) {//建立top关系//建图
lin[s[i][j] - 'a'][s[i + ][j] - 'a'] = ;
in[s[i + ][j] - 'a']++;
}
}
else if(len1 > len2) flag = ;
}
if(!flag) cout << "Impossible" << '\n';
else if(flag) {
flag = topsort_solve();
if(!flag) cout << "Impossible" << '\n';
else {
for(int i = ; i <= top; ++i)
cout << ans[i];
cout << '\n';
}
}
return ;
}
集训考试题(CF510C Fox And Names的简化版)的更多相关文章
- CF510C Fox And Names——拓扑排序练习
省委代码: #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> # ...
- Codeforces Round #290 (Div. 2) C. Fox And Names dfs
C. Fox And Names 题目连接: http://codeforces.com/contest/510/problem/C Description Fox Ciel is going to ...
- C. Fox And Names
C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- CF Fox And Names (拓扑排序)
Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- codeforce 510C Fox And Names(拓扑排序)
Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- (CodeForces 510C) Fox And Names 拓扑排序
题目链接:http://codeforces.com/problemset/problem/510/C Fox Ciel is going to publish a paper on FOCS (Fo ...
- Fox And Names
Description Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce ...
- [CF #290-C] Fox And Names (拓扑排序)
题目链接:http://codeforces.com/contest/510/problem/C 题目大意:构造一个字母表,使得按照你的字母表能够满足输入的是按照字典序排下来. 递归建图:竖着切下来, ...
- 拓扑排序 Codeforces Round #290 (Div. 2) C. Fox And Names
题目传送门 /* 给出n个字符串,求是否有一个“字典序”使得n个字符串是从小到大排序 拓扑排序 详细解释:http://www.2cto.com/kf/201502/374966.html */ #i ...
随机推荐
- P1404 平均数
题目描述 给一个长度为n的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度>=m. 输入输出格式 输入格式: N+1行, 第一行两个整数n和m 接下来n行,每行一个整数a[ ...
- [NOIP2017 TG D2T2]宝藏
题目大意:给定一个有重边,边有权值的无向图.从某一个点出发,求到达所有的点需要的最少费用,并且限制两点之间只有一条路径.费用的计算公式为:所有边的费用之和.而边$x->y$的费用就为:$y$到初 ...
- 周记【距gdoi:91天】
这星期挺没状态的.听蔡大神讲组合游戏,然后欢乐得以为自己懂了,然后看到题目就懵了,然后就各种乱各种走神……但是某大神们(kpm和child)疯狂地切题.然后又颓废了两个晚上后决定滚回去文化课(oi没状 ...
- POJ3261 Milk Patterns 【后缀数组】
牛奶模式 时间限制: 5000MS 内存限制: 65536K 提交总数: 16796 接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进 ...
- 【BZOJ 1485】[HNOI2009]有趣的数列 卡特兰数
这个题我是冲着卡特兰数来的所以就没有想到什么dp,当然也没有想到用卡特兰数的原因........... 你只要求出前几项就会发现是个卡特兰数,为什么呢:我们选择地时候要选择奇数位和偶数位,相邻(一对里 ...
- 【BZOJ 3144】 [Hnoi2013]切糕 真·最小割
一开始一脸懵逼后来发现,他不就是割吗,我们只要满足条件就割就行了,于是我们把他连了P*Q*R条边,然而我们要怎样限制D呢?我们只要满足对于任意相邻的两条路,只要其有个口大于D就不行就好了因此我们只要把 ...
- 【BZOJ1458】士兵占领 最大流的模板题
我们只要把他们可以有的限制用流量限制,再用两者关系限制一下就可以开心的跑了. #include <cstdio> #include <cstring> #include < ...
- 在JS中,一切东东其实都是对象
对象是组成JavaScript的基本单元,在JS中,一切东东其实都是对象,而且功能非常强大,它不仅风格独特,功能也与众不同. 一.引用(reference) 引用的概念是JS的基础之一,它是指向对象实 ...
- 修改innodb_flush_log_at_trx_commit参数提升insert性能
最近,在一个系统的慢查询日志里发现有个insert操作很慢,达到秒级,并且是比较简单的SQL语句,把语句拿出来到mysql中直接执行,速度却很快. 这种问题一般不是SQL语句本身的问题,而是在具体的应 ...
- NYOJ 349 Sorting It All Out (拓扑排序 )
题目链接 描述 An ascending sorted sequence of distinct values is one in which some form of a less-than ope ...