E【中】假的字符串(trie+拓扑排序)
题目
做法
一个字符串能作为最小值最基础的条件为不能出现前缀字符串
我们需要确定一种每个字符的排名使得\(s\)作为最小值,另有很多字符串\(t\),与\(s\)第一个不相同的位置可以产生一种偏序限制,如\(s-x,t_y,rk_x<rk_y\)
而判断是否可行直接跑拓扑排序就行
code
#include<bits/stdc++.h>
typedef int LL;
const LL maxn=300009;
typedef std::string str;
str s[30009],ans[30009];
LL nod,n,tot;
LL son[maxn][27],val[maxn],du[30];
std::vector<LL> to[27];
inline void Insert(str t){
LL now(0),len(t.size());
for(LL i=0;i<len;++i){
LL c(t[i]-'a');
if(!son[now][c]) son[now][c]=++nod;
now=son[now][c];
}
++val[now];
}
std::queue<LL> que;
inline bool top_sort(){
LL ret(0);
for(LL i=0;i<26;++i) if(!du[i]) que.push(i),ret|=(1<<i);
while(que.size()){
LL u(que.front()); que.pop();
for(LL i=0;i<to[u].size();++i){
LL v(to[u][i]);
--du[v];
if(!du[v]) que.push(v),ret|=(1<<v);
}
}
return ret==((1<<26)-1);
}
inline bool Check(str t){
LL now(0),len(t.size());
memset(du,0,sizeof(du));
for(LL i=0;i<26;++i)
to[i].clear();
for(LL i=0;i<len;++i){
LL c(t[i]-'a');
for(LL j=0;j<26;++j){
if(son[now][j] && j!=c){
++du[j];
to[c].push_back(j); //to[j].push_back(c);
}
}
if(val[now]) return false;
now=son[now][c];
}
return top_sort();
}
int main(){
scanf("%d",&n);
for(LL i=1;i<=n;++i){
std::cin>>s[i];
Insert(s[i]);
}
for(LL i=1;i<=n;++i)
if(Check(s[i]))
ans[++tot]=s[i];
printf("%d\n",tot);
for(LL i=1;i<=tot;++i) std::cout<<ans[i]<<std::endl;
return 0;
}/*
6
mcfx
ak
ioi
wen
l
a
*/
E【中】假的字符串(trie+拓扑排序)的更多相关文章
- 牛客比赛-假的字符串-Trie+拓扑
链接:https://www.nowcoder.com/acm/contest/59/B来源:牛客网 题目描述 给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个 ...
- [bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)
题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...
- bzoj 3012: [Usaco2012 Dec]First! Trie+拓扑排序
题目大意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最小的串,并输出这些串.n <= 30,000 , m <= 300,0 ...
- 拓扑排序 POJ 1094 Sorting It All Out
题意:给定N个字和M行他们之间的关系,要求输出他们的拓扑排序.此题采用边输入边检测的方式,如果发现环,就结束并输出当前行号:如果读取到当前行时,可以确定拓扑序列就输出,不管后面的输入(可能包含环路): ...
- 拓扑排序--UVa10305
题目 Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n tasks to do. Unfortun ...
- tsort - 拓扑排序
tsort - 拓扑排序 本文链接:http://codingstandards.iteye.com/blog/834572 (转载请注明出处) 用途说明 tsort命令通常用于解决一种逻辑问题, ...
- 拓扑排序(Topological Order)
Date:2019-06-17 14:43:59 算法描述 1.定义队列Q,并把所有入度为0的结点加入队列 2.取队首结点,输出.然后删除所有从它除法的边,并令这些边到达的顶点的入度-1,若某个顶点的 ...
- python 排序 拓扑排序
在计算机科学领域中,有向图的拓扑排序是其顶点的先行排序,对于每个从顶点u到顶点v的有向边uv,在排序的结果中u都在v之前. 如果图是有向无环图,则拓扑排序是可能的(为什么不说一定呢?) 任何DAG具有 ...
- Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )
题意 : 给出含有 N 个点 M 条边的图(可能不连通或者包含环),每个点都标有一个小写字母编号,然后问你有没有一条路径使得路径上重复字母个数最多的次数是多少次,例如图上有条路径的顶点标号顺序是 a ...
随机推荐
- 线程一(lock)
对于线程同步操作最简单的一种方式就是使用 lock 关键字,通过 lock 关键字能保证加锁的线程只有在执行完成后才能执行其他线程. lock 的语法形式如下. lock(object) { ...
- JS定时器做物体运动
JS定时器是函数 setInterval(函数体/函数名 , 时间) 清楚定时器 clearInterval(函数) 时间单位(毫秒) 1000毫秒 = 1秒 首先我们要知道用JS定时器能干什么? ...
- STM8 定时器
中断映射表 对应stm8_interrupt.c #pragma vector=1 __interrupt void TRAP_IRQHandler(void) { } #pragma vector= ...
- synchronize与lock
1. synchronize的作用 synchronize是java最原始的同步关键字,通过对方法或者代码块进行加锁实现对临界区域的保护.线程每次进去同步方法或者代码块都需要申请锁,如果锁被占用则会等 ...
- 阿里云给自己实例扩容-扩展分区和文件系统_Linux系统盘
阿里云买了台服务器ecs 磁盘容量40g 发现已经用了30g了 赶紧扩容 进入 e'cs实例 进入左边菜单 存储与快照 然后选择右边的扩容 然后支付 成功后 进入服务器 df -h 发现怎么还是没变 ...
- Nginx 安装 和 特性介绍
一:nginx 环境搭建 四项确认 确认系统网络可通行 确认yum可用 确认关闭iptables规则 确认停用selinux 查看iptables规则 iptables -L 关闭iptables规则 ...
- L ==> E · L · K
三剑客:Elastic Stack 在学习ELK前,先对 Lucene作基本了解. 今天才知道关系型数据库的索引是 B-Tree,罪过... 减少磁盘寻道次数 ---> 提高查询性能 Lucen ...
- git命令——git commit
功能 将暂存区中的更改记录到仓库. 加到staging area里面的文件,是表示已经准备好commit的.所以在commit修改之前,务必确定所有修改文件都是staged的.对于unstaged的文 ...
- 自动构建的deploy.sh
#!/usr/bin/env sh # 当发生错误时中止脚本 set -e # 构建 npm run build # cd 到构建输出的目录下 cd dist # 部署到自定义域域名 # echo ' ...
- Nginx http升级到https
http和https的区别是 有的网站,http打开的时候,页面提示不安全,比如你点击下面的网站 [其实是同一个网站] http://www.511easy.com/bug/login http:// ...