P3065 [USACO12DEC]First! G
题意描述
不错的一道题。
给你 \(N\) 个字符串,要求你求出可能的字典序最小的字符串。
对于 可能的最小的字符串,你可以任意排列 \(26\) 个字母,使得其字典序最小。
举个栗子:(好像就是样例)
4
omm
moo
mom
ommnom
首先明确一点:当一个单词为另一个单词的前缀时,较长的单词不可能为字典序最小的。
然后发现:
- 我们可以使用标准字母表使
mom排在第一个。(即字典序最小) - 也可以使用字母表
abcdefghijklonmpqrstuvwxyz使得omm排在第一个。
就是酱紫。
算法分析
字符串让人联想到 \(trie\) 树,优先级关系让人联想到 拓扑排序,于是就解决了。
- 建立一颗 \(trie\) 树。(有需要的可以看看 trie 树学习笔记)
- \(dfs\),这个...很基础吧。
- 对于每一个字符串,建立一张有向图,利用 拓扑排序 判断其是否有环,无环就输出。
对于每一个字符串,我们可以设它的字典序是所有字符串中最小的。
也就是说,这个字符串的第 \(i\) 个字母 在 \(trie\) 的第 \(i\) 层(根节点算第 \(0\) 层)的所有字母中 字典序最小。
设这个字符串的第 \(i\) 个字母为 \(u\),我们可以连单向边 \(u \to v\),表示我们指定了 \(u\) 的字典序比 \(v\) 小。(其中 \(v\) 是第 \(i\) 层的其它字母)
根据题目描述里的粗体部分,当在遍历时已有字母为单词结尾(即有前缀)可以直接返回 false。
当 \(26\) 个字母间的关系形成环时,也一定不能成为字典序最小的串。
代码实现
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#include<queue>
#define N 300010
using namespace std;
int n,trie[N][30],tot=1,ru[30],ans=0;
bool sum[N],flag[N],edge[30][30];
string s[N];
queue<int>q;
void insert(string x){
int p=1;
for(int i=0;i<x.size();i++){
int ch=x[i]-'a';
if(!trie[p][ch]) trie[p][ch]=++tot;
p=trie[p][ch];
}
sum[p]=true;
return;
}
void topo(){
while(!q.empty()) q.pop();
for(int i=0;i<26;i++) if(!ru[i]) q.push(i);
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=0;i<26;i++){
if(edge[now][i])
if(!(--ru[i])) q.push(i);
}
}
return;
}
bool ask(string x){
int p=1;
memset(edge,false,sizeof(edge));
memset(ru,0,sizeof(ru));
for(int i=0;i<x.size();i++){
if(sum[p]) return false;
int ch=x[i]-'a';
for(int j=0;j<26;j++){
if(ch!=j && trie[p][j] && !edge[ch][j]){
++ru[j];edge[ch][j]=true;
}
}
p=trie[p][ch];
}
topo();
for(int i=0;i<26;i++)
if(ru[i]) return false;
return true;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>s[i];
insert(s[i]);
}
for(int i=1;i<=n;i++){
if(ask(s[i])){
ans++;flag[i]=true;
}
}
printf("%d\n",ans);
for(int i=1;i<=n;i++){
if(flag[i]) cout<<s[i]<<endl;
}
return 0;
}
结语
trie 树真是个好东西
完结撒花。
P3065 [USACO12DEC]First! G的更多相关文章
- [luogu P3065] [USACO12DEC]第一!First!
[luogu P3065] [USACO12DEC]第一!First! 题目描述 Bessie has been playing with strings again. She found that ...
- 洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
P3065 [USACO12DEC]第一!First! 题目链接:https://www.luogu.org/problemnew/show/P3065 题目描述 Bessie一直在研究字符串.她发现 ...
- P3065 [USACO12DEC]第一!First!
题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...
- Luogu P3065 [USACO12DEC]第一!First!【字典树/拓扑排序】By cellur925
题意:给你许多字符串,你可以改变字母序大小,问有哪些字符串可能成为字典序最小的字符串. 我们考虑把这些字符串都塞到\(trie\)树上.之后检索每一个字符串的时候,我们看和他同一层的地方是否有字符,如 ...
- [USACO12DEC]第一!First! (Trie树,拓扑排序)
题目链接 Solution 感觉比较巧的题啊... 考虑几点: 可以交换无数次字母表,即字母表可以为任意形态. 对于以其他字符串为前缀的字符串,我们可以直接舍去. 因为此时它所包含的前缀的字典序绝对比 ...
- Storyboards Tutorial 03
这一节主要介绍segues,static table view cells 和 Add Player screen 以及 a game picker screen. Introducing Segue ...
- 文件图标SVG
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink ...
- [bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)
题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...
- Milk Pumping G&Milk Routing S 题解
Milk Pumping G&Milk Routing S 双倍经验时间 洛谷P5837 [USACO19DEC]Milk Pumping G 洛谷P3063 [USACO12DEC]Milk ...
随机推荐
- linux应用-线程操作
文章写得好,转载一下, https://blog.csdn.net/triorwy/article/details/80380977
- LPCTSTR类型和字符串
转载: 1.https://blog.csdn.net/Joker_mw/article/details/79127790 2.https://blog.csdn.net/shelleyhuhu/ar ...
- C++ “string”: 未声明的标识符
转载:https://blog.csdn.net/kkkmmmjjjj/article/details/53780549 解决方案: 要添加using namespace std;语句在宏定义后面. ...
- Pock 把 Touch Bar 变成系统中的 Dock 栏
Pock 把 Touch Bar 变成系统中的 Dock 栏 Pock 是一款 macOS App,你可以通过它把 Touch Bar 变成系统中的 Dock 栏,直接用来切换和启动 App,尽享全屏 ...
- 一个Java对象的内存布局
1.对象的创建过程 class loading class linking(verification,preparation,resolution) class initializing 申请对象内存 ...
- Vue3实战系列:结合 Ant-Design-of-Vue 实践 Composition API
Vue 3 出来之后,很多人有如下想法,"又要学新东西啦"."我学不动了"等等. 但是事物总有它的两面性,前端知识更新的很快,利好勤奋好学的同学.计算机行业的迭 ...
- linux 路径结构
/bin /boot /data /dev /etc /home /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /sbin /sr ...
- DDOS、CC、sql注入,跨站攻击防御方法
web安全常见攻击解读--DDos.cc.sql注入.xss.CSRF 一,DDos https://www.cnblogs.com/sochishun/p/7081739.html#4111858 ...
- python 不定长参数
1 #不定长参数 * 元祖 ** 字典 2 def item(a,b,*c,**d): 3 print(a) 4 print(b) 5 print(c) 6 print(d) 7 8 item(11, ...
- 【C语言C++编程入门】——编译机制和语言标准!
编程机制 编写程序时必须遵循确切步骤主要是取决于你的计算机环境.因为 C语言是可以移植的,所以它在许多环境中可用,其中包括 UNIX,Linux,Windows等等 . 不过,让我们首先来看一看许多环 ...