BZOJ3012 : [Usaco2012 Dec]First!
建立Trie,那么成为答案的串必须满足其终止节点到根路径上没有其它点。
对于Trie上每个节点维护一个bitset,表示哪些字符必须在哪些字符之前。
每到达一个可能成为答案的终止节点,对图进行拓扑排序进行判定。
时间复杂度$O(26^2N+26|S|)$。
#include<cstdio>
#include<cstring>
#define rep(i) for(int i=0;i<26;i++)
const int N=30010,M=300010;
int n,i,j,k,x,cnt,len,st[N],en[N],fin[N],ans;
int tot,son[M][26],id[M],v[M],f[M][26];
int g[26][26],d[26],q[30];
char s[M],text[M];
void dfs(int x){
if(id[x]){
rep(i)for(int j=d[i]=0;j<26;j++)g[i][j]=0;
rep(i)rep(j)if(i!=j&&(f[x][i]>>j&1))g[i][j]=1,d[j]++;
int h=1,t=0;
rep(i)if(!d[i])q[++t]=i;
while(h<=t){
int x=q[h++];
rep(i)if(g[x][i])if(!(--d[i]))q[++t]=i;
}
if(t==26)fin[id[x]]=1,ans++;
return;
}
rep(i)if(son[x][i]){
int y=son[x][i];
rep(j)f[y][j]=f[x][j];
f[y][i]|=v[x];
dfs(y);
}
}
int main(){
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%s",s);
len=strlen(s);
st[i]=cnt;
for(j=x=0;j<len;x=son[x][k],j++)if(!son[x][k=text[cnt++]=s[j]-'a'])son[x][k]=++tot,v[x]|=1<<k;
id[x]=i;
en[i]=cnt;
}
dfs(0);
for(printf("%d\n",ans),i=1;i<=n;i++)if(fin[i]){
for(j=st[i];j<en[i];j++)putchar(text[j]+'a');
puts("");
}
return 0;
}
BZOJ3012 : [Usaco2012 Dec]First!的更多相关文章
- 【BZOJ3012】[Usaco2012 Dec]First! Trie树+拓补排序
[BZOJ3012][Usaco2012 Dec]First! Description Bessie has been playing with strings again. She found th ...
- BZOJ 3011: [Usaco2012 Dec]Running Away From the Barn( dfs序 + 主席树 )
子树操作, dfs序即可.然后计算<=L就直接在可持久化线段树上查询 -------------------------------------------------------------- ...
- BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序
BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序 题意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最 ...
- BZOJ_3011_[Usaco2012 Dec]Running Away From the Barn _可并堆
BZOJ_3011_[Usaco2012 Dec]Running Away From the Barn _可并堆 Description 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于l的 ...
- 【BZOJ3011】[Usaco2012 Dec]Running Away From the Barn 可并堆
[BZOJ3011][Usaco2012 Dec]Running Away From the Barn Description It's milking time at Farmer John's f ...
- [Usaco2012 Dec]First! BZOJ3012
分析: 其实我们可以很容易的想到,如果一个串是另一个串的子串,那么必定长的那个串不可能是字典序最小的串.其次,如果一个串为了使他成为字典序最小的串儿出现了矛盾的情况,那么也不可能是字典序最小的串.那么 ...
- [BZOJ3011][Usaco2012 Dec]Running Away From the Barn
题意 给出一棵以1为根节点树,求每个节点的子树中到该节点距离<=l的节点的个数 题解 方法1:倍增+差分数组 首先可以很容易的转化问题,考虑每个节点对哪些节点有贡献 即每次对于一个节点,找到其第 ...
- bzoj 3012: [Usaco2012 Dec]First! Trie+拓扑排序
题目大意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最小的串,并输出这些串.n <= 30,000 , m <= 300,0 ...
- BZOJ 3012: [Usaco2012 Dec]First! 字典树 + tarjan
Code: #include<bits/stdc++.h> #define maxn 1000003 using namespace std; char str[maxn],strtot[ ...
随机推荐
- ios中的category与extension
http://blog.csdn.net/haishu_zheng/article/details/12873151 category和extension用来做类扩展的,可以对现有类扩展功能或者修 ...
- c++ exports def文件
https://msdn.microsoft.com/zh-cn/library/hyx1zcd3(v=vs.80).aspx EXPORTS 引入了一个由一个或多个 definitions(导出的函 ...
- [官方说明] 为什么ES4要分成两阶段?
从ES4第一个版本发布到现在,已经有段时间了,绝大多数坛友都已经适应了ES4所带来的新封装模式,但仍有部分新人和坛友对ES4的两阶段模式带有不解或曲解.本帖将就ES4的两阶段意义做出解释说明,希望更多 ...
- 【js】将table的每个td的内容自动赋值给其title属性
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )
在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略 ...
- Easy Multiple Copy to Clipboard by ZeroClipboard
要实现在多个复制按钮复制的功能(具体代码在附件中,路径修改一下就行了): <%@ page language="java" import="java.util.*& ...
- mysql sql维护常用命令
mysql修改表名,列名,列类型,添加表列,删除表列 alter table test rename test1; --修改表名 alter table test add column name v ...
- SQL表值函数和标量值函数的区别
SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的, ...
- Junit4测试
1.junit初级入门 2.常用注解 3.运行流程 4.测试套件使用 5.参数化设置
- Digit Counts
Count the number of k's between 0 and n. k can be 0 - 9. Example if n = 12, k = 1 in [0, 1, 2, 3, 4, ...