题目描述

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.

输入输出样例

输入样例#1:

omm
moo
mom
ommnom
输出样例#1:

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+拓扑排序判环)的更多相关文章

  1. Legal or Not(拓扑排序判环)

    http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Others)   ...

  2. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39602   Accepted: 13 ...

  3. LightOJ1003---Drunk(拓扑排序判环)

    One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...

  4. HDU1811 拓扑排序判环+并查集

    HDU Rank of Tetris 题目:http://acm.hdu.edu.cn/showproblem.php?pid=1811 题意:中文问题就不解释题意了. 这道题其实就是一个拓扑排序判圈 ...

  5. Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)

    Almost Acyclic Graph CodeForces - 915D time limit per test 1 second memory limit per test 256 megaby ...

  6. [USACO12DEC]第一!First! (Trie树,拓扑排序)

    题目链接 Solution 感觉比较巧的题啊... 考虑几点: 可以交换无数次字母表,即字母表可以为任意形态. 对于以其他字符串为前缀的字符串,我们可以直接舍去. 因为此时它所包含的前缀的字典序绝对比 ...

  7. 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环

    [题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一 ...

  8. [Luogu3065][USACO12DEC]第一!First!

    题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...

  9. bzoj 3012: [Usaco2012 Dec]First! Trie+拓扑排序

    题目大意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最小的串,并输出这些串.n <= 30,000 , m <= 300,0 ...

随机推荐

  1. bzoj1604

    treap+并查集 我们能想到一个点和最近点对连接,用并查集维护,但是这个不仅不能求,而且还是不对的,于是就看了题解 把距离转为A(x-y,x+y),这样两点之间的距离就是max(x'-X',y'-Y ...

  2. gerrit+gitlab整合调试

  3. JS复制文件(转)

    <script type="text/javascript"> var fso, f; function copyFile() { fso = new ActiveXO ...

  4. [读书笔记1]《C语言嵌入式系统编程修炼》

      大学前两年一直搞的是单片机,写的是嵌入式C语言程序,走过了不少弯路,现在感觉仍然在走弯路.有幸偶尔看到了这篇文章,深感自己以前写程序的时候存在很多误区.现写篇博客做下总结. 作者:宋宝华出处:天极 ...

  5. [Code+#1]大吉大利,晚上吃鸡!

    输入输出样例 输入样例#1: 7 7 1 7 1 2 2 2 4 2 4 6 2 6 7 2 1 3 2 3 5 4 5 7 2 输出样例#1: 6 输入样例#2: 5 5 1 4 1 2 1 1 3 ...

  6. WebSphere设置会话超时时间

    WebSphere Application Server的会话超时时间可以在三个层面进行设置,分别为:应用程序服务器级别.应用程序级别和代码层面进行设置. 设置方式:应用程序级别级别和应用级别可以通过 ...

  7. 02—IOC实现项目中的解耦

  8. VB.NET 小程序 4

    Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ...

  9. Python(2)-第二天

    除法 >>> 8 / 5 1 >>> 8 / 5.0 1.6 >>> 8.0 / 5 1.6 >>> 8 // 5.0 1.0 ...

  10. 关于defineProperty

    var c=0; Object.defineProperty(this,'b',{ get :function(){ return ++c; } }) console.log(b===1&&a ...