[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 ...
随机推荐
- 近年来火热的人工智能,其实是IT业界的一个障眼法
近年来火热的人工智能,其实是IT业界的一个障眼法,仗着现在的计算机的计算能力牛B,把一个类仿生统计算法,宣传成了人工智能,不得不感叹一些营销人士的牛逼,说大话不腰疼.当然谎言重复一千遍也许自己也就信了 ...
- bzoj3450 Easy(概率期望dp)
3450: Tyvj1952 Easy Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 876 Solved: 648[Submit][Status] ...
- 源码阅读之LinkedList(JDK8)
inkedList概述 LinkedList是List和Deque接口的双向链表的实现.实现了所有可选列表操作,并允许包括null值. LinkedList既然是通过双向链表去实现的,那么它可以被当作 ...
- Parameterized testing with any Python test framework
1. 在进行单元测试时,很多时候需要进行参数化 尝试过使用 from nose_parameterized import parameterized 但在使用过程中会报错,后来将上面的内容改为了下面的 ...
- Linux C编程 GCC的使用
本篇文章面向一些会linux文件操作与vim基本命令,编程大佬请移步勿喷. gcc是默认安装的,但是其还缺少常用的头文件和库文件,所以还需要build-essential这个包,可以在联网状态下使用如 ...
- 二分搜索 POJ 1064 Cable master
题目传送门 /* 题意:n条绳子问切割k条长度相等的最长长度 二分搜索:搜索长度,判断能否有k条长度相等的绳子 */ #include <cstdio> #include <algo ...
- 397 Integer Replacement 整数替换
给定一个正整数 n,你可以做如下操作:1. 如果 n 是偶数,则用 n / 2替换 n.2. 如果 n 是奇数,则可以用 n + 1或n - 1替换 n.n 变为 1 所需的最小替换次数是多少?示例 ...
- mysql 更改字符集
Windows: 安装目录下新建my.ini文件,输入一下内容 [mysqld]#修改服务器端默认字符编码格式为utf8character-set-server = utf8 [client]#修改客 ...
- JS在即将离开当前页面(刷新或关闭)时触发事件
// onbeforeunload 事件在即将离开当前页面(刷新或关闭)时触发 window.onbeforeunload = function () { return /^\#\/ipinfo/.t ...
- headroom.js使用
为页面顶部多留些空间.在不需要页头时将其隐藏 需要添加的css代码 .headroom { transition: transform 200ms linear; } .headroom--pinne ...