Trie+拓扑排序——Luogu3065 [USACO12DEC]第一!First!
来源:互联网 发布:高新区网络问政平台 编辑:程序博客网 时间:2024/06/10 01:21
题面:Luogu3065
我们首先考虑一种情况,如果某一字符串的某个前缀是另外一个字符串,这个字符串不可能字典序最小。
所以我们来考虑相同前缀的问题。如果某一字符串字典序最小,和它同前缀的字符串的相同前缀之后一位字母的大小顺序就可以确定。如果这一系列的关系没有矛盾的话,这个串就可以是最小的,反之不行。
判断有无矛盾的话我们可以通过建连边跑拓扑排序解决。至于找前缀这种问题,交给Trie树就好了。
#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <iostream>#include <ctime>#include <map>#include <queue>#include <cstdlib>#include <string>#include <climits>#include <set>#include <vector>using namespace std;bool b[300010];int n,nedge=0,p[2010],nex[2010],head[2010],rd[2010];int nxt[300010][26],ans=0,cnt=0,anss[200010];char s[30010][310];inline void pre(){ nedge=0;memset(nex,0,sizeof nex); memset(head,0,sizeof head);memset(rd,0,sizeof rd);}inline void addedge(int a,int b){ p[++nedge]=b;nex[nedge]=head[a];head[a]=nedge;}inline void insert(int x){ int len=strlen(s[x]+1),now=0; for(int i=1;i<=len;i++){ int p=s[x][i]-'a'; if(!nxt[now][p])nxt[now][p]=++cnt; now=nxt[now][p]; } b[now]=1;}inline bool check(int x){ int len=strlen(s[x]+1),now=0; for(int i=1;i<=len;i++){ int p=s[x][i]-'a'; if(b[now])return 0; for(int i=0;i<26;i++)if(p!=i&&nxt[now][i])addedge(p+1,i+1),rd[i+1]++; now=nxt[now][p]; } return 1;}inline bool topo(){ queue<int>q;for(int i=1;i<=26;i++)if(!rd[i])q.push(i); while(!q.empty()){ int now=q.front();q.pop(); for(int k=head[now];k;k=nex[k])if(rd[p[k]]){ rd[p[k]]--;if(!rd[p[k]])q.push(p[k]); } } for(int i=1;i<=26;i++)if(rd[i])return 0; return 1;}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s[i]+1); insert(i); } for(int i=1;i<=n;i++){ pre(); if(check(i)&&topo())anss[++ans]=i; } printf("%d\n",ans); for(int i=1;i<=ans;i++)printf("%s\n",s[anss[i]]+1); return 0;}
阅读全文
1 0
- Trie+拓扑排序——Luogu3065 [USACO12DEC]第一!First!
- 【bzoj3012】[Usaco2012 Dec]First! trie+拓扑排序
- 图论——拓扑排序
- 图论——拓扑排序
- 拓扑排序——HDU1258
- 拓扑排序算法—HDU1285
- Vijos[1028]魔族密码 Trie树+拓扑排序
- 深度优先搜索DFS(depth first search),拓扑排序
- BZOJ 3012: [Usaco2012 Dec]First! 字典树 拓扑排序
- 图论算法——拓扑排序
- toj2892Task 拓扑排序——模板
- 拓扑排序——确定比赛名次
- 拓扑排序——nyoj 496
- 确定比赛名次——拓扑排序
- 产生冠军——拓扑排序
- 数据结构例程——拓扑排序
- 2016春季练习——拓扑排序
- 图——AOV拓扑排序
- 树状数组
- Java Socket编程
- Install TensorFlow
- 29、C#:C#去除字符串的最后一个字符
- git的分支管理策略
- Trie+拓扑排序——Luogu3065 [USACO12DEC]第一!First!
- ZOJ 3449 Doraemon's Number Game III (数论)
- Paper read weekly(one)
- JVM(2):JVM内存结构
- 二级函数指针
- Scrapy--命令行
- java基础--反射(1)
- 反序列化自动填写表单
- Codeforces Round #428 (Div. 2) -ABC