牛客比赛-假的字符串-Trie+拓扑
链接:https://www.nowcoder.com/acm/contest/59/B
来源:牛客网
题目描述
给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们
输入描述:
第一行一个数表示n
之后n行每行一个字符串表示给定的字符串
输出描述:
第一行输出一个数x表示可行的字符串个数
之后输出x行,每行输出一个可行的字符串
输出的顺序和输入的顺序一致
输入
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+拓扑的更多相关文章
- E【中】假的字符串(trie+拓扑排序)
题目 E[中]假的字符串 做法 一个字符串能作为最小值最基础的条件为不能出现前缀字符串 我们需要确定一种每个字符的排名使得\(s\)作为最小值,另有很多字符串\(t\),与\(s\)第一个不相同的位置 ...
- 牛客 51011 可达性统计(拓扑排序,bitset)
牛客 51011 可达性统计(拓扑排序,bitset) 题意: 给一个 n个点,m条边的有向无环图,分别统计每个点出发能够到达的点的数量(包括自身) \(n,m\le30000\). 样例: 10 1 ...
- 牛客比赛-Wannafly9-A/B/C
A-链接:https://www.nowcoder.com/acm/contest/71/A来源:牛客网 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数 ...
- 牛客比赛-状压dp
链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意 ...
- 牛客——Rabbit的字符串
题目: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 Rabbit得到了一个字符串,她的好朋 ...
- 牛客练习赛11 假的字符串 (Trie树+拓扑找环)
牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...
- 牛客寒假算法基础集训营3B 处女座的比赛资格(用拓扑排序解决DAG中的最短路)
链接:https://ac.nowcoder.com/acm/contest/329/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客小白月赛3 B 躲藏【动态规划/字符串出现cwbc子序列多少次】
链接:https://www.nowcoder.com/acm/contest/87/B来源:牛客网 XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏 Cwbc藏在多个不区分大小写的字符串中. 好奇的X ...
- 牛客网 牛客练习赛11 A.假的线段树
看不懂题意,而且太菜,写了两道就溜了... A.假的线段树 链接:https://www.nowcoder.com/acm/contest/59/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2 ...
随机推荐
- pandas 报错:【sys:1: DtypeWarning: Columns (15) have mixed types. Specify dtype option on import or set low_memory=False.】
错误原因 报错提示:“sys:1: DtypeWarning: Columns (15) have mixed types. Specify dtype option on import or set ...
- pop 在列表中和字典中的区别
pop 在列表中和字典中的区别 字典中 pop() 语法:dict.pop(key,[value]) 说明:删除指定键及对应的值,如果在字典中不存在键及value,则返回pop()中指定的key对应的 ...
- 华为大数据项目fusionInsight
项目简述:基于开源Hadoop2.0架构的集群网络,进行海量数据的分布式计算.由于Hadoop集群规模不断扩大,而搭建一个同等规模的测试集群需要一笔昂贵的开销.目前有100台左右物料,期望预测计算节点 ...
- React:快速上手(3)——列表渲染
React:快速上手(3)——列表渲染 使用map循环数组 了解一些ES6 ES6, 全称 ECMAScript 6.0 ,是 JaveScript 的下一个版本标准,2015.06 发版.ES6 主 ...
- koa2.0富文本编辑器的选择历程
本人学习vue和koa2.0,做了一个简单的个人博客,博客自然会需要富文本编辑器的选择,由于nodejs和koa2.0,于是便开始了不断尝试的历程. 一.ueditor 刚开始在百度搜索,自然第一个发 ...
- npm国内镜像设置
http://cnodejs.org/topic/4f9904f9407edba21468f31e
- 图像运动去模糊(Motion Deblurring)代码
http://blog.csdn.net/qianliheshan/article/details/12853157 http://www.di.ens.fr/~whyte/ Efficient De ...
- [国家集训队] calc(动规+拉格朗日插值法)
题目 P4463 [国家集训队] calc 集训队的题目真是做不动呀\(\%>\_<\%\) 朴素方程 设\(f_{i,j}\)为前\(i\)个数值域\([1,j]\),且序列递增的总贡献 ...
- 一些好用的Linux命令工具
刚好看到一个系列的博文,讲的就是那些平时很少被人用到但是很实用的命令,选一些觉得自己应该比较常用到的出来写个笔记. 这些命令有些不是系统命令,需要自行下载安装.Debian下安装:sudo apt-g ...
- Git服务器的Gitosis安装配置及gitignore的使用方法
Git服务器Gitosis安装设置 1.安装 openssh服务器 sudo apt-get install openssh-server openssh-client 2.创建个人公钥和私钥 在默认 ...