(我恨字符串)

惯例化简题目:给定n个字符串,可以改变字符的相对大小(在字典序中的大小),问:字符串i是否能成为最小的字符串(字典序)

解题过程:

  • 首先你可以预处理出来26的全排列然后暴力然后你只要用神威太湖之光开O2就能过了
  • 秒切字典树
  • 推出一堆没用的结论。

说一下思考过程:首先字典树能找前缀都知道吧

  1. 观察样例,得:对于不能变成第一的,那么一定是有一个跟它有相同前缀的字符串,但是不完全相等,要有比当前串小的。
  2. 然后和旁边大佬一起歪歪瞎搞:建立一棵字典树,然后对于每个字符串跑一遍字典树,如果能找到相同的前缀&&最终终点不在一个分叉上&&分叉比当前串终点小(这里可能要意会一下....算了我上图)

(打标记的是字串结束的地方,软件为了防止重复在相同的字母后加了数字去重,无用)

先看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」第一(字典树+拓扑排序)的更多相关文章

  1. Luogu P3065 [USACO12DEC]第一!First!【字典树/拓扑排序】By cellur925

    题意:给你许多字符串,你可以改变字母序大小,问有哪些字符串可能成为字典序最小的字符串. 我们考虑把这些字符串都塞到\(trie\)树上.之后检索每一个字符串的时候,我们看和他同一层的地方是否有字符,如 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. [BZOJ2815][ZJOI2012]灾难 灭绝树+拓扑排序+lca

    灾难 [问题描述] 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那 么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的 生态灾难. 学过 ...

  9. [bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)

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

随机推荐

  1. PHP高效产生m个n范围内的不重复随机数(m<=n)

    该算法非常巧妙的取随机数的位置(数组的下标),替代取随机数本身,每次取到一个随机数之后,就将其在取值范围中排除,下一次仅会在剩下的数字中取,一次遍历就可以完成随机数的选取,效率相当高. functio ...

  2. Axure实现百度登录页面(一)

    本文主要实现了百度登录页面的设计,其中最主要的是实现点击用户名和密码框时使边框颜色发生变化 (1)首先拖入一个矩形框,将边框可见性全部去掉 (2)将百度的图片拖入,将“用户名密码登录”和“短信快捷登录 ...

  3. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

  4. 使用TryGetComponent取代GetComponent以避免Editor中的内存分配

    作为Unity开发人员,可能或多或少都会遇到过一个常见的Unity的GC分配问题——在Editor中使用GetComponent方法来获取一个不存在的Component时会分配额外的内存.就像下图 需 ...

  5. 手把手教你吧Python应用到实际开发 不再空谈悟法☝☝☝

    手把手教你吧Python应用到实际开发 不再空谈悟法☝☝☝ 想用python做机器学习吗,是不是在为从哪开始挠头?这里我假定你是新手,这篇文章里咱们一起用Python完成第一个机器学习项目.我会手把手 ...

  6. CH3801Rainbow的信号

    Description Freda发明了传呼机之后,rainbow进一步改进了传呼机发送信息所使用的信号.由于现在是数字.信息时代,rainbow发明的信号用N个自然数表示.为了避免两个人的对话被大坏 ...

  7. Vue中的循环以及修改差值表达式

    0828自我总结 一.Vue中的循环 v-for 常见的4总情况 #第一种 <div v-for="item in items"></div> #第二种 & ...

  8. HTML innerHTML、textContext、innerText

    网址 : https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML 1.innerHTML : 获得.修改元素的用HTML语 ...

  9. shell数组(四)

    [root@ipha-dev71- exercise_shell]# cat test.sh #!/bin/bash my_array=(a b c d) echo "第一个元素为:${my ...

  10. 18.Tomcat基本应用

    1.JVM基本介绍 JAVA编译型 ---> 编译 C 编译型---> linux --->编译一次 windows --->编译一次 macos ubuntu 跨平台 移值型 ...