[bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)
题目描述
Bessie has been playing with strings again. She found that by
changing the order of the alphabet she could make some strings come before all the others lexicographically (dictionary ordering).
For instance Bessie found that for the strings "omm", "moo", "mom", and "ommnom" she could make "mom" appear first using the standard alphabet and that she could make "omm" appear first using the alphabet
"abcdefghijklonmpqrstuvwxyz". However, Bessie couldn't figure out any way to make "moo" or "ommnom" appear first.
Help Bessie by computing which strings in the input could be
lexicographically first by rearranging the order of the alphabet. To compute if string X is lexicographically before string Y find the index of the first character in which they differ, j. If no such index exists then X is lexicographically before Y if X is shorter than Y. Otherwise X is lexicographically before Y if X[j] occurs earlier in the alphabet than Y[j].
给出n个字符串,问哪些串能在特定的字母顺序中字典序最小。
输入输出格式
输入格式:
Line 1: A single line containing N (1 <= N <= 30,000), the number of strings Bessie is playing with.
- Lines 2..1+N: Each line contains a non-empty string. The total number of characters in all strings will be no more than 300,000. All characters in input will be lowercase characters 'a' through 'z'. Input will contain no duplicate strings.
输出格式:
Line 1: A single line containing K, the number of strings that could be lexicographically first.
- Lines 2..1+K: The (1+i)th line should contain the ith string that could be lexicographically first. Strings should be output in the same order they were given in the input.
输入输出样例
omm
moo
mom
ommnom
omm
mom
说明
The example from the problem statement.
Only "omm" and "mom" can be ordered first.
Solution
要想使一个词语的字典序最小,首先应满足长度尽量短,也就是没有任何一个词构成当前词的前缀
其次是词的每一位都要严格大于与之享有共同前缀的词语
首先对词典建一棵trie
要满足答案的串必须满足其终止节点到根没有其他终止节点,也就是第一个限定
向需要规定大小关系的字符间连边
拓扑排序一下,判环,若无环则可以作为答案输出
(最近尽量写思路清晰但是比较长的程序,其实我是有能力写得很短跑得很快的,但在平时这样似乎没有什么意义,思路清晰最重要吧,毕竟把程序变快是很简单的事)
#include <stdio.h>
#include <memory.h>
#define MaxN 30010
#define MaxL 300010
#define MaxBuf 1<<22
#define Blue() ((S==T&&(T=(S=B)+fread(B,1,MaxBuf,stdin),S==T))?0:*S++)
char B[MaxBuf],*S=B,*T=B;
template<class Type>inline void Rin(Type &x){
x=;int c=Blue();
for(;c<||c>;c=Blue())
;
for(;c>&&c<;c=Blue())
x=(x<<)+(x<<)+c-;
}
inline void geTc(char *C,int &x){
x=;char c=Blue();
for(;c<'a'||c>'z';c=Blue())
;
for(;c>='a'&&c<='z';c=Blue())
*C++=c,x++;
}
bool g[][];
char ch[MaxL],fol[MaxL];
int n,l,pointer,ans,lef[MaxN],in[],out[],o[MaxN];
class Trie{
int ch[MaxL][],root,tot,belong[MaxL];
public:
Trie(){
root=tot=;
memset(ch,,sizeof ch);
memset(belong,,sizeof belong);
}
inline void insert(char *C,int len,int tim){
int at=root;
lef[tim]=pointer;
for(int i=;i<len;i++){
fol[pointer++]=C[i];
if(!ch[at][C[i]-'a'])
ch[at][C[i]-'a']=++tot;
at=ch[at][C[i]-'a'];
}
belong[at]=tim;
}
inline bool design(int i){
int at=root;
for(int j=lef[i];j<lef[i+];j++){
if(belong[at])return false;
int c=fol[j]-'a';
for(int k=;k<;k++)
if(ch[at][k]&&k!=c&&!g[c][k]){
g[c][k]=true;
in[k]++;
out[c]++;
}
at=ch[at][c];
}
return true;
}
}Tree;
namespace enumerate{
bool vis[];
int _que[],hd,tl,tot,sum;
inline bool topsort(){
tot=sum=;
hd=;tl=;
for(int i=;i<;i++){
if(in[i] || out[i])
tot++;
if(!in[i] && out[i]){
_que[++tl]=i; vis[i]=true;
}
else vis[i]=false;
}
while(hd<=tl){
sum++;
int now=_que[hd++];
for(int i=;i<;i++)
if(g[now][i]){
in[i]--;
if(!in[i] && !vis[i]){
_que[++tl]=i; vis[i]=true;
}
}
}
return tot==sum;
}
void main(){
for(int i=;i<=n;i++){
memset(g,false,sizeof g);
memset(in,,sizeof in);
memset(out,,sizeof out);
if(Tree.design(i) && topsort())
o[++ans]=i;
}
}
}
#define FO(x) {freopen(#x".in","r",stdin);}
int main(){
FO(usaco12dec first);
Rin(n);
for(int i=;i<=n;i++){
geTc(ch,l);
Tree.insert(ch,l,i);
}
lef[n+]=pointer;
enumerate::main();
printf("%d\n",ans);
for(int i=;i<=ans;i++){
for(int j=lef[o[i]];j<lef[o[i]+];j++)
putchar(fol[j]);
putchar('\n');
}
return ;
}
[bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)的更多相关文章
- Legal or Not(拓扑排序判环)
http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Others) ...
- POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)
Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39602 Accepted: 13 ...
- LightOJ1003---Drunk(拓扑排序判环)
One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...
- HDU1811 拓扑排序判环+并查集
HDU Rank of Tetris 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1811 题意:中文问题就不解释题意了. 这道题其实就是一个拓扑排序判圈 ...
- Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)
Almost Acyclic Graph CodeForces - 915D time limit per test 1 second memory limit per test 256 megaby ...
- [USACO12DEC]第一!First! (Trie树,拓扑排序)
题目链接 Solution 感觉比较巧的题啊... 考虑几点: 可以交换无数次字母表,即字母表可以为任意形态. 对于以其他字符串为前缀的字符串,我们可以直接舍去. 因为此时它所包含的前缀的字典序绝对比 ...
- 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环
[题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一 ...
- [Luogu3065][USACO12DEC]第一!First!
题目描述 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 ...
随机推荐
- linux shell 实例1
UI项目删除“UIL”文件中的无用字串: 脚本需要制定UIL文件目录位置&无用字串的txt文件,如删除海尔目录下的无用字串: ./delete_uil_string.sh ./haier/UI ...
- is not mapped [from错误
我出现的错误是:org.hibernate.hql.ast.QuerySyntaxException: loginuser is not mapped [from loginuser] 配置文件如下: ...
- DTO和ENTITY的关系
DTO是数据传输对象:主要用于封装前台页面传过来的数据,在各个层之间进行数据的传递,主要用于接受前台数据进行封装并向各个层之间传递数据(个人理解是向下层传递数据),定义方法跟Bean规范一致 ENTI ...
- 10.12NOIP模拟题(2)
/* 有谁知道这道题结论是怎么来的? 晚上问问学数学的孩子23333 */ #include<iostream> #include<cstdio> #include<cs ...
- bzoj1085骑士精神(搜索)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1893 Solved: 1051 Description ...
- Shell脚本,简单& 强大
摘自<码农增刊Linus与Linux>,章节:你可能不知道的Shell. 最近阅读完这本书,觉得其中有很多不错的内容,这是其中的一个Shell小甜点,拿来和大家一起分享一下,增加了 ...
- 设计模式("大话设计模式"读书笔记 C#实现)
前言:毫无疑问 ,学习一些设计模式,对我们的编程水平的提高帮助很大.写这个博客的时候自己刚开始学习设计模式,难免有错,欢迎评论指正. 我学设计模式的第一本书是“大话设计模式”. 1.为什么要学设计模式 ...
- arp学习笔记(linux高性能服务编程)
先看看arp的定义吧 现在linux运行这条命令 tcpdump -i eth0:1 -ent '(dst 192.168.5.190 and src 192.168.5.109)or( dst 19 ...
- SVN的三种merge方式【转】
SVN的merge操作是为了保证主干(trunk)和分支(branch)同步,merge方式有: 1.Merge a range of revisions(合并一个范围的版本) 2.Reintegra ...
- python学习笔记(3)——进制符号&转换公式
进制转换法则: 进制符号 bin().oct().hex().int('',进制)+待转格式数 10进制→其他进制 # dec2bin # 十进制 to 二进制: bin() >>> ...