链接:https://www.nowcoder.com/acm/contest/59/B
来源:牛客网

题目描述

给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们

输入描述:

第一行一个数表示n
之后n行每行一个字符串表示给定的字符串

输出描述:

第一行输出一个数x表示可行的字符串个数
之后输出x行,每行输出一个可行的字符串
输出的顺序和输入的顺序一致
示例1

输入

6
mcfx
ak
ioi
wen
l
a

输出

5
mcfx
ioi
wen
l
a

备注:

对于100%的数据,
n <= 30000 , 字符串总长<= 300000
字符集为小写字符
题目很是扯淡,,数据更扯淡,,不知道字符最大长度,MLE了几次,改小了又WA,还好最后试对了= =要是给出字符串最大长度就好了。
比赛时根本不知道题目在说什么鬼,其实就是询问某个字符串是否能最小,考虑作为最小的条件,S(最小)与另个字符串P比较时,遇到的第一个不相等的字符(位置j)时,S[j]<P[j]要成立,
我们将所有的字符串建成一颗trie时,对于某个被当做最小的字母,经过的所有的节点都要小于它的兄弟节点。暴力的找一下每个节点的兄弟建图即可。e[i][j]=1表示字符i<j成立。
我们只要找到所有的这些条件,在讨论是否能同时满足即可,这个问题显然就是拓扑排序,只要不出现环即可,问题转化为找图中是否有环。用floyd传递闭包即可。这个题有点卡时空。
 #include<bits/stdc++.h>
using namespace std;
const int MAX_SIG=;
const int MAX_NOD=;
char str[][];
bool ok[];
int ch[MAX_NOD][MAX_SIG];
int val[MAX_NOD],sz;
char s[MAX_NOD];
int e[][];
int idx(char c){return c-'a';} void _insert(char *s)
{
int u=,n=strlen(s);
for(int i=;i<n;++i){
int c=idx(s[i]);
if(!ch[u][c]) ch[u][c]=sz++;
u=ch[u][c];
}
val[u]++;
} bool solve(int k)
{
memset(e,,sizeof(e));
int n=strlen(str[k]);
int u=;
for(int i=;i<n;++i){
int c=idx(str[k][i]);
if(val[ch[u][c]]&&i!=n-) return ;
for(int j=;j<MAX_SIG;++j){
if(j==c) continue;
if(ch[u][j]) e[c][j]=;
}
u=ch[u][c];
}
for(int k=;k<MAX_SIG;++k)
{
for(int i=;i<MAX_SIG;++i)
{
if(!e[i][k]) continue;
for(int j=;j<MAX_SIG;++j)
{
if(e[k][j]&&e[j][i]) return ;
}
}
for(int i=;i<MAX_SIG;++i)
{
if(!e[i][k]) continue;
for(int j=;j<MAX_SIG;++j)
{
if(e[k][j]) e[i][j]=;
}
}
}
return ;
} int main()
{
int n;
while(cin>>n){
sz=;
for(int i=;i<=n;++i){
scanf("%s",str[i]);
_insert(str[i]);
}
int ans=;
for(int i=;i<=n;++i){
int k=solve(i);
if(k){
ok[i]=;
ans++;
}
}
cout<<ans<<endl;
for(int i=;i<=n;++i)
if(ok[i]) cout<<str[i]<<endl;
}
return ;
}

牛客比赛-假的字符串-Trie+拓扑的更多相关文章

  1. E【中】假的字符串(trie+拓扑排序)

    题目 E[中]假的字符串 做法 一个字符串能作为最小值最基础的条件为不能出现前缀字符串 我们需要确定一种每个字符的排名使得\(s\)作为最小值,另有很多字符串\(t\),与\(s\)第一个不相同的位置 ...

  2. 牛客 51011 可达性统计(拓扑排序,bitset)

    牛客 51011 可达性统计(拓扑排序,bitset) 题意: 给一个 n个点,m条边的有向无环图,分别统计每个点出发能够到达的点的数量(包括自身) \(n,m\le30000\). 样例: 10 1 ...

  3. 牛客比赛-Wannafly9-A/B/C

    A-链接:https://www.nowcoder.com/acm/contest/71/A来源:牛客网 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数 ...

  4. 牛客比赛-状压dp

    链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意 ...

  5. 牛客——Rabbit的字符串

    题目: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 Rabbit得到了一个字符串,她的好朋 ...

  6. 牛客练习赛11 假的字符串 (Trie树+拓扑找环)

    牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...

  7. 牛客寒假算法基础集训营3B 处女座的比赛资格(用拓扑排序解决DAG中的最短路)

    链接:https://ac.nowcoder.com/acm/contest/329/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  8. 牛客小白月赛3 B 躲藏【动态规划/字符串出现cwbc子序列多少次】

    链接:https://www.nowcoder.com/acm/contest/87/B来源:牛客网 XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏 Cwbc藏在多个不区分大小写的字符串中. 好奇的X ...

  9. 牛客网 牛客练习赛11 A.假的线段树

    看不懂题意,而且太菜,写了两道就溜了... A.假的线段树 链接:https://www.nowcoder.com/acm/contest/59/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2 ...

随机推荐

  1. JS-排序详解:冒泡排序、选择排序和快速排序

    JS-排序详解-冒泡排序 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在 ...

  2. 携程greenlet模块使用

    import greenlet def f1(): print(11) gr2.switch() print(22) gr2.switch() def f2(): print(33) gr1.swit ...

  3. tornado web应用程序结构

    tornado web 应用程序通常包含一个或者多个RequestHandler 子类,一个Application 对象来为每个控制器路由到达的请求和一个mian()函数 import tornado ...

  4. linux c编程:互斥锁

    们常说互斥锁保护临界区,实际上是说保护临界区中被多个线程或进程共享的数据.互斥锁保证任何时刻只有一个线程在执行其中的代码. 互斥锁具有以下特点: ·原子性:把一个互斥锁定义为一个原子操作,这意味着操作 ...

  5. Android Studio设置行宽、格式化断行

    设置基于Android studio 1.2,其它版本可能位置不大一样,可以直接搜索 1.设置行宽 就是那条右标准线的位置:Setting-->Editor-->Code Style,右侧 ...

  6. Hadoop应用开发实战案例 第2周 Web日志分析项目 张丹

    课程内容 本文链接: 张丹博客 http://www.fens.me 用Maven构建Hadoop项目 http://blog.fens.me/hadoop-maven-eclipse/程序源代码下载 ...

  7. beego——多种格式的数据输出

    beego当初设计的时候就考虑了API功能的设计,而我们在设计API的时候经常是输出JSON或者XML数据,那么beego提供了这样的方式直接输出: 1.JSON格式输出 func (this *Ad ...

  8. python 的两个模块xlwt,xlrd,写入和读取Excel数据

    http://www.cnblogs.com/fireme/p/3887284.html 这上面写的很全,不过我只需要简单的读和写的操作就ok了,下面是我写的读和写入Excel操作 读取Excel数据 ...

  9. Flask 请求源码分析

    执行app.run()方法: def run(self, host=None, port=None, debug=None, **options): from werkzeug.serving imp ...

  10. s5_day4作业

    # #流程控制练习题: # #==========>基础部分 # #练习一: # if True or False and False: # print('yes') # else: # pri ...