题目大意:

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

题解:

首先我们可以把所有的串插入到Trie树中。
然后我们枚举每个串,判断是否存在可行方案
我们枚举到一个串,那么我们就在Trie树中进行查找
每一次从某一个节点向下走的时候,我们都要保证当前走的这条支路是字典序最小的
也就是这条支路上的字母的字典序小于这个节点上的其他所有支路的字典序
所以我们就成功的找出了一些字典序的大小关系
所以我们只需要判断这个关系是不是存在环,如果存在环那么一定不可行
否则即可行
判环嘛。。。用拓扑排序不久好了嘛233.
----------------------------------------------------------------
然后让我来吐槽一下这个cin,cout会RE的题目
共30000个字符串,总长300000,是不是我要开一个30000*300000的char数组?
这内存不还得飞起来啊!!!!
用string不久好了? cin cout 不能用!!!你拿什么读入和输出啊!!!!
什么 cin cout 不能用???
可以用 ! 只是RE罢了!!!!
那怎么读入!!!??
你可以先读入一个char数组,然后转成string,然后输出的时候用putchar输出
。。。 。。。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
inline void read(int &x){x=0;char ch;bool flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 30010;
const int maxc = 300010;
int ch[maxc][27],nodecnt;
bool ed[maxc];
inline void insert(string s){int nw = 0,len = s.size();for(int i=0;i<len;++i){if(ch[nw][s[i]-'a'] == 0) ch[nw][s[i]-'a'] = ++nodecnt;nw = ch[nw][s[i]-'a'];}ed[nw] = true;
}
bool mp[40][40];int deg[40];
int q[40],l,r;
inline bool judge(string s){memset(mp,0,sizeof mp);memset(deg,0,sizeof deg);int nw = 0,len = s.size();for(int i=0;i<len;++i){for(int c='a';c<='z';++c){if((c == s[i]) || (ch[nw][c - 'a'] == 0)) continue;if(!mp[s[i]-'a'][c-'a']){mp[s[i]-'a'][c-'a'] = true;++deg[c-'a'];}}if(ed[nw]) return false;nw = ch[nw][s[i]-'a'];}l = 0;r = -1;for(int i=0;i<26;++i){if(deg[i] == 0) q[++r] = i;}   while(l <= r){int u = q[l++];for(int i=0;i<26;++i){if(mp[u][i]){if(--deg[i] == 0) q[++r] = i;}}}if(r == 25) return true;return false;
}
bool flag[maxn];
string s[maxn];
char str[maxc];
int main(){int n;read(n);for(int i=1;i<=n;++i){scanf("%s",str);int m = strlen(str);s[i] = "";for(int j=0;j<m;++j){s[i] = s[i] + str[j];}insert(s[i]);}int ans = 0;for(int i=1;i<=n;++i){if(judge(s[i])){flag[i] = true;++ ans;}}printf("%d\n",ans);for(int i=1;i<=n;++i){if(flag[i]){int m = s[i].size();for(int j=0;j<m;++j){putchar(s[i][j]);}puts("");}}getchar();getchar();return 0;
}

转载于:https://www.cnblogs.com/Skyminer/p/6446006.html

bzoj 3012: [Usaco2012 Dec]First! Trie+拓扑排序相关推荐

  1. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 609  Solved: 318 [Submit][Status][ ...

  2. bzoj 2330 / AcWing 368 银河 差分约束系统+tarjan缩点+拓扑排序

    怎么最近bzoj一直上不了,莫非是挂了? AcWing的地址:https://www.acwing.com/problem/content/370/ 题意: 银河中的恒星浩如烟海,但是我们只关注那些最 ...

  3. bzoj 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通(拓扑排序?+DP)

    1638: [Usaco2007 Mar]Cow Traffic 奶牛交通 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 971  Solved: 37 ...

  4. 洛谷 P3041 视频游戏的连击Video Game Combos(AC自动机+拓扑排序+数位DP)

    洛谷 P3041 视频游戏的连击Video Game Combos 难度一般,不过这个数位DP其实应该叫做记忆化搜索 题意:玩游戏时可以通过按键组合打出combo技能:然后是已知N个combo的按键方 ...

  5. java 有向无环图 树_拓扑排序-有向无环图(DAG, Directed Acyclic Graph)

    条件: 1.每个顶点出现且只出现一次. 2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面. 有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说. 一 ...

  6. 【图论】有向无环图的拓扑排序

    1. 引言 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环.常常被用来表示事件之间的驱动依赖关系,管理任务之间的调度.拓扑排序是对DA ...

  7. C#实现有向无环图(DAG)拓扑排序

    对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在 ...

  8. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  9. usaco frame up(所有拓扑排序的输出)

    先根据图建图再拓扑排序. /** ID: jinbo wu TASK: frameup LANG:C++ */ #include<bits/stdc++.h> using namespac ...

  10. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

最新文章

  1. windows7下解决caffe check failed registry.count(type) == 1(0 vs. 1) unknown layer type问题
  2. c++缓冲区buffer
  3. html中加session,Html中如何获取session中的值(如登录后显示XX欢迎您!)
  4. TDD Tip:方法内部New出来的对象如何Mock
  5. Dubbo服务暴露原理
  6. Python中的网络编程之UDP
  7. 如何构建GFS分布式存储平台?理论+实操!
  8. 《大数据》编辑推荐 | 基于遥感大数据的信息提取技术综述
  9. Linux下TCP循环接收数据的方式
  10. Linux命令行下WEP密码破解(通用,也可非BT平台)
  11. 《高级职称证书挂靠价格一览表》
  12. 如何通俗的理解函数的极限_函数的极限问题怎么解释更通俗易懂?初高中数学辅导...
  13. 77道JVM系列面试题总结(2万字解析)
  14. 毕业设计 基于JSP动漫论坛的设计与实现
  15. zucc c语言上机答案,ZUCC第三章 习题答案.doc
  16. vv_jeffy之spring4.x集成myibatis3.x
  17. 记录自己激光打眼手术过程
  18. 面向服务的整车E/E架构(SOA)开发咨询服务
  19. grep命令帮你恢复误删文件
  20. Mac系统使用经验记录

热门文章

  1. AC日记——图灵机游戏 codevs 2292
  2. [hadoop读书笔记] 第五章 MapReduce工作机制
  3. Posix线程编程指南(2)
  4. 七年三套房,阿里程序员炫富,努力就有回报,感谢当初的选择!
  5. 机器学习知识体系 (强烈推荐)
  6. 阿里B2B技术架构演进详解 一篇创业者必须收藏的文章
  7. 好好工作,别想不开去创业。
  8. 你应该知道的一些 ADB 命令
  9. 被动语态和非谓语区别_语法考点:非谓语动词!
  10. 四面快手归来,分享Java真题及面经:策略模式+红黑树+Java锁+Redis+Kafka等分布式