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


(我恨字符串)
惯例化简题目:给定n个字符串,可以改变字符的相对大小(在字典序中的大小),问:字符串i是否能成为最小的字符串(字典序)
解题过程:
- 首先你可以预处理出来26的全排列然后暴力然后你只要用神威太湖之光开O2就能过了
- 秒切字典树
- 推出一堆没用的结论。
说一下思考过程:首先字典树能找前缀都知道吧
- 观察样例,得:对于不能变成第一的,那么一定是有一个跟它有相同前缀的字符串,但是不完全相等,要有比当前串小的。
- 然后和旁边大佬一起歪歪瞎搞:建立一棵字典树,然后对于每个字符串跑一遍字典树,如果能找到相同的前缀&&最终终点不在一个分叉上&&分叉比当前串终点小(这里可能要意会一下....算了我上图)

(打标记的是字串结束的地方,软件为了防止重复在相同的字母后加了数字去重,无用)
先看omm,按照上面的结论,很明显可以,其实不然
然后发现....样例打了从样例发现的结论的脸......
solution:
想想怎么判断无解....
一个条件先于另外一个条件....
如果先到自己头上,那就暴毙了。。。
这....拓扑排序??
貌似是这样。
于是,我们在字典树上跑一下,对于一个分支(相同前缀的几个字符)像这样:

连单向边之后,跑tpsort,如果有环的话(先到自己头上了,不明白自己去学tpsort),那就是一个无解情况
注意,连边不是在树上,而是在字母表上,字母表的每一个都会有初始边(a->b->c->d->e->f->g......->y->z)然后在上述过程中人为加边,然后跑tpsort,一开始我在这里卡住了
然后每个跑就行了,代码没有太大难度,字典树的板子背掉就行了(或者拿临接表硬模)。
代码:(注意,每跑一个要清零。)
#include<bits/stdc++.h>
#define register
using namespace std;
const int maxn=3e5+;
string s[maxn];
struct edge
{
int to,next;
}e[]; int head[],cnt; inline void addedge(int from,int to)
{
e[++cnt].next=head[from];
e[cnt].to=to;
head[from]=cnt;
} int t[maxn][];
int vis[maxn];
int used[][];
int f;
int tot;
int ru[];
int n;
int ans[maxn];
int anscnt;
inline void update(string x)
{
int u=,tt;
for( int i=;i<x.size();i++)
{
tt=x[i]-'a';
if(!t[u][tt])
{
t[u][tt]=++tot;
}
u=t[u][tt];
}
vis[u]=;
}
inline void solve(string x)
{
int u=,tt;
for( int i=;i<x.size();i++)
{
tt=x[i]-'a';
if(vis[u])
{
f=;
return;
}
for( int j=;j<;j++)
{
if(t[u][j]&&j!=tt&&!used[tt][j])
{
used[tt][j]=;
addedge(tt,j);
ru[j]++;
}
}
u=t[u][tt];
}
} inline int tpsort()
{
deque < int > q;
for( int i=;i<;i++)
{
if(ru[i]==)
q.push_back(i);
}
while(!q.empty())
{
int u=q.front();
q.pop_front();
for( int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
ru[v]--;
if(ru[v]==)
{
q.push_back(v);
}
}
}
for( int i=;i<;i++)
{
if(ru[i]!=)
return ;
}
return ;
} int main()
{
ios::sync_with_stdio(false);
cin>>n;
for( int i=;i<=n;i++)
{
cin>>s[i];
update(s[i]);
}
for( int i=;i<=n;i++)
{
cnt=;
f=;
memset(head,,sizeof(head));
memset(ru,,sizeof(ru));
memset(used,,sizeof(used));
solve(s[i]);
if(f) continue;
if(tpsort()) ans[++anscnt]=i;
}
printf("%d\n",anscnt);
for(int i=;i<=anscnt;i++)
{
printf("%s\n",s[ans[i]].c_str());
}
return ;
}
(完)
「Usaco2012 Dec」第一(字典树+拓扑排序)的更多相关文章
- Luogu P3065 [USACO12DEC]第一!First!【字典树/拓扑排序】By cellur925
题意:给你许多字符串,你可以改变字母序大小,问有哪些字符串可能成为字典序最小的字符串. 我们考虑把这些字符串都塞到\(trie\)树上.之后检索每一个字符串的时候,我们看和他同一层的地方是否有字符,如 ...
- BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序
BZOJ_3012_[Usaco2012 Dec]First!_trie树+拓扑排序 题意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最 ...
- 洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
P3065 [USACO12DEC]第一!First! 题目链接:https://www.luogu.org/problemnew/show/P3065 题目描述 Bessie一直在研究字符串.她发现 ...
- [USACO12DEC]第一!First! (Trie树,拓扑排序)
题目链接 Solution 感觉比较巧的题啊... 考虑几点: 可以交换无数次字母表,即字母表可以为任意形态. 对于以其他字符串为前缀的字符串,我们可以直接舍去. 因为此时它所包含的前缀的字典序绝对比 ...
- Trie树|字典树(字符串排序)
有时,我们会碰到对字符串的排序,若采用一些经典的排序算法,则时间复杂度一般为O(n*lgn),但若采用Trie树,则时间复杂度仅为O(n). Trie树又名字典树,从字面意思即可理解,这种树的结构像英 ...
- BZOJ3832[Poi2014]Rally——权值线段树+拓扑排序
题目描述 An annual bicycle rally will soon begin in Byteburg. The bikers of Byteburg are natural long di ...
- BZOJ4383 Pustynia(线段树+拓扑排序)
线段树优化建图暴力拓扑排序即可.对于已确定的数,拓扑排序时dp,每个节点都尽量取最大值,如果仍与已确定值矛盾则无解.叶子连出的边表示大于号,其余边表示大于等于. #include<iostrea ...
- [BZOJ2815][ZJOI2012]灾难 灭绝树+拓扑排序+lca
灾难 [问题描述] 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那 么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的 生态灾难. 学过 ...
- [bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)
题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...
随机推荐
- 刷新:重新发现.NET与未来
微软在比尔·盖茨手中创立并崛起, 成为PC互联网时代的霸主,很多70,80后都有MVP Ediwang的体验: 当时的微软对我来说就是神的存在.因为我认识电脑到使用电脑的一切几乎都离不开这家伟大的公司 ...
- springmvc框架的使用
1.在idea中新建java web项目,引入spring和springmvc所需jar包,其中 spring-web-3.2.12.RELEASE.jar:在web应用开发时使用spring框架所需 ...
- 未来实现API管理系统的几个关键词
下面将通过几个关键词的形式说明API管理的重要性和未来的实现方式. 1.生命周期管理 在整个API生命周期中更深入地集成所有工具将进一步提高生命周期循环的速度,而且更重要的是提供满足消费者需求的API ...
- BT面板安装php报错configure: error: C preprocessor “/lib/cpp” fails sanity check
使用宝塔面板安装扩展时已经显示添加安装成功了,待我刷新浏览器之后没有安装成功.看了一下执行日志. 缺少必要的C++库,如下命令重装解决. yum reinstall glibc-headers gcc ...
- 02-20 kd树(鸢尾花分类)
[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...
- 【TencentOS tiny】深度源码分析(4)——消息队列
消息队列 在前一篇文章中[TencentOS tiny学习]源码分析(3)--队列 我们描述了TencentOS tiny的队列实现,同时也点出了TencentOS tiny的队列是依赖于消息队列的, ...
- 基于vue组件,发布npm包
亲测好用,如出错,请留言 1.项目初始化 使用vue脚手架创建,但vuecli太重,我们使用简单的工程脚手架进行处理,输入命令 vue init webpack-simple my-project n ...
- Hydra爆破神器使用
参数详解: -R 根据上一次进度继续破解-S 使用SSL协议连接-s 指定端口-l 指定用户名-L 指定用户名字典(文件)-p 指定密码破解-P 指定密码字典(文件)-e 空密码探测和指定用户密码探测 ...
- Ubuntu 终端中文回显乱码
参考文章 : http://wiki.ubuntu.org.cn/%E4%BF%AE%E6%94%B9locale 所用 Ubuntu的版本 : 猜想是这样的: 1.字符的编码和显示时,所处的环境不是 ...
- python学习-文件I/O
12.2使用os.path操作目录 # os.path_test.py import os import time print(os.path.abspath("abc.txt") ...