题意:给你许多字符串,你可以改变字母序大小,问有哪些字符串可能成为字典序最小的字符串。

我们考虑把这些字符串都塞到\(trie\)树上。之后检索每一个字符串的时候,我们看和他同一层的地方是否有字符,如果有,我们就从他到同层字符连一条有向边,因为只有同层字符妨碍他可能会成为第一。之后进行拓扑排序,检查这种情况是否可以存在即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue> using namespace std; int n,len,ans,tot,cnt;
int trie[300900][130],op[30090],head[100],du[100];
bool end[300090];
string tmp;
string dic[30090];
struct node{
int to,next;
}edge[1000]; void insert()
{
int p=0;
for(int i=0;i<len;i++)
{
int qwq=tmp[i]-'a';
if(!trie[p][qwq]) trie[p][qwq]=++tot;
p=trie[p][qwq];
}
end[p]=1;
} void add(int x,int y)
{
edge[++cnt].to=y;
edge[cnt].next=head[x];
head[x]=cnt;du[y]++;
} bool work()
{
int p=0;
for(int i=0;i<len;i++)
{
int qwq=tmp[i]-'a';
if(end[p]) return 0;
for(int j=0;j<26;j++)
if(trie[p][j]&&qwq!=j) add(qwq,j);
p=trie[p][qwq];
}
return 1;
} bool topsort()
{
queue<int>q;
for(int i=0;i<26;i++)
if(du[i]==0) q.push(i);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(--du[v]==0) q.push(v);
}
}
for(int i=0;i<26;i++)
if(du[i]) return 0;
return 1;
} void clear()
{
memset(du,0,sizeof(du));
cnt=0;
memset(head,0,sizeof(head));
} int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>dic[i];
len=dic[i].length();
tmp=dic[i];
insert();
}
for(int i=1;i<=n;i++)
{
tmp=dic[i];len=dic[i].length();
if(work()&&topsort()) op[++ans]=i;
clear();
}
printf("%d\n",ans);
for(int i=1;i<=ans;i++)
cout<<dic[op[i]]<<endl;
return 0;
}

注意几点:连边的\(tot\)和字典树的指针\(cnt\)开始用混了。然后不管判断是否成功,每次都要清空(可能跑拓扑判定了)

Luogu P3065 [USACO12DEC]第一!First!【字典树/拓扑排序】By cellur925的更多相关文章

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

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

  2. 「Usaco2012 Dec」第一(字典树+拓扑排序)

    (我恨字符串) 惯例化简题目:给定n个字符串,可以改变字符的相对大小(在字典序中的大小),问:字符串i是否能成为最小的字符串(字典序) 解题过程: 首先你可以预处理出来26的全排列然后暴力然后你只要用 ...

  3. [luogu P3065] [USACO12DEC]第一!First!

    [luogu P3065] [USACO12DEC]第一!First! 题目描述 Bessie has been playing with strings again. She found that ...

  4. 洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)

    P3065 [USACO12DEC]第一!First! 题目链接:https://www.luogu.org/problemnew/show/P3065 题目描述 Bessie一直在研究字符串.她发现 ...

  5. P3065 [USACO12DEC]第一!First!

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

  6. BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序

    BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序 题意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最 ...

  7. Trie树|字典树(字符串排序)

    有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英 ...

  8. BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序

    题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...

  9. BZOJ4383 Pustynia(线段树+拓扑排序)

    线段树优化建图暴力拓扑排序即可.对于已确定的数,拓扑排序时dp,每个节点都尽量取最大值,如果仍与已确定值矛盾则无解.叶子连出的边表示大于号,其余边表示大于等于. #include<iostrea ...

随机推荐

  1. (C)位字段(bit-field)

    位字段(bit-field) 在存储空间很宝贵的情况下,有可能需要将多个对象保存在一个机器字中,一种常用的方法是:使用类似于编译器符号表的单个二进制位标志集合,外部强加的数据格式(如设备接口等寄存器) ...

  2. Contiki 2.7 Makefile 文件(六)

    5.第五部分 ifndef CONTIKI $(error CONTIKI not defined! You must specify where CONTIKI resides!) endif if ...

  3. JAVA-关键字&标识符

    关键字: 关键字就是在java程序中具备特殊含义的标识符.关键字一般用于描述一个程序的结构或者表示数据类型.他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. ...

  4. CSS3咖啡制作全过程动画

    CSS3咖啡制作全过程动画是一款利用纯CSS3实现的咖啡制作全过程动画特效,从把咖啡豆导入杯子,到把咖啡煮好,整个动画还比较流畅. 源码:http://www.huiyi8.com/sc/8788.h ...

  5. 分享知识-快乐自己:SpringMVC 结合使用拦截器(判断是否用户是否已登陆)

    基础拦截器操作: 拦截器是一种AOP操作实现,那么在AOP之中用户一定不需要去关注拦截器的存在,用户只需要按照自己已经习惯的处理方式进行代码的编写即可. 首先我们先创建一个自定义的拦截器: packa ...

  6. codeforces 660B B. Seating On Bus(模拟)

    题目链接: B. Seating On Bus time limit per test 1 second memory limit per test 256 megabytes input stand ...

  7. linux 进程学习笔记-信号semaphore

    信号灯(信号量)不是进程通信手段,其是用于控制和协调在进程间通信过程中的共享资源访问,就如同互斥锁(两者的区别可以参考这里) 可以将简单地将信号灯想象成一个计数器,初始时计数器值为n(有n个资源可供使 ...

  8. jQuery精华

    第一章:入门 选择元素: $() css() $("li").css():可以省略原生的循环操作 $ == jQuery jQuery方法函数化: click() html() J ...

  9. Oracle查询24小时制的时间格式

    select to_date('2016-11-11 13:42:27', 'yyyy/mm/dd hh24:mi:ss') from dual.

  10. webapi 跨域 (MVC-Web API: 405 method not allowed问题 )

    使用webapi cors 1.安装包:Install-Package Microsoft.AspNet.WebApi.Cors –IncludePrerelease 2.在webapiconfig. ...