2023-7-14

题目

luogu题目传送门

题目描述

Nina 和 Emilija 正在玩一个特殊的游戏。这个游戏是在一张最开始为空白的纸上进行的。在每一个人的行动回合内,这个人会在这张纸上当前的单词后面加入一个字母。她们会轮流行动,而 Nina 先手行动。

操作者必须保证这样一个条件:在添加完一个字符后,整张纸上的单词必须是操作人最喜欢的歌曲的一个单词的前缀。如果不满足条件,进行这个操作的人就输了。

你的问题是,如果两个人都采取最优策略,那么谁会获得最后的胜利。

输入格式

第一行包含一个正整数 \(n\),表示 Nina 最喜爱歌曲中的单词数量。

接下来的 \(n\) 行,每一行输入 Nina 最喜爱歌曲中的一个单词。

接下来的一行包含一个正整数 \(m\),表示 Emilija 最喜爱歌曲中的单词数量。

接下来的 \(m\) 行,每一行输入 Emilija 最喜爱歌曲中的一个单词。

输入的单词都只包含小写字母,且单词长度总和不超过 \(200000\)。

输出格式

输出获胜的玩家,Nina 或 Emilija。

样例输入

2
aaa
bbb
3
aab
aba
bbb

样例输出

Nina

难度&重要性(1~10):5.5

题目来源

COCI,luogu

题目算法

字典树

解题思路

因为它要求必须是为喜欢的歌的前缀,那么我们就很容易想到建一个字典树记录所有歌。

在记录所有歌的同时,再用一个变量来表示这一段前缀是公共的,还是只有 Nina 或 Emilija 有。

例如样例数据:

2
aaa
bbb
3
aab
aba
bbb

建出的字典树如图:



这里的 \(1\) 表示的是 Nina 的前缀,\(2\) 表示的是 Emilija 的前缀,\(3\) 表示是公共前缀。

因为是回合制的游戏,所以字典树的相邻两层是由不同的人来选择的。

我们只需要在字典树上跑一个 dfs,每一次来判断上一层的人的选择是否可行。

即如果第 \(i\) 层的第 \(j\) 个字符,如果这个人可以通过选下一层的一个字符获胜,那么就说明另一个人不应该选择第 \(i\) 层的第 \(j\) 个字符。

反之如果这个人怎么选都不可以获胜,那么就说明另一个人可以通过第 \(i\) 层的第 \(j\) 个字符获胜。

Code

void make(int k){//建字典树
int len=s.size(),u=0;
For(i,0,len-1){
int c=s[i]-'a';
if(!ch[u][c].i)ch[u][c].i=++tot;
if(ch[u][c].k==0)ch[u][c].k=k;//如何没有出现过,那就只有这一个人
if(ch[u][c].k!=k)ch[u][c].k=3;//如何另一个人也有这个前缀,那这就是公共的
u=ch[u][c].i;
}
return;
} bool dfs(int u,int p){
int k=0;
For(i,0,25)
if(ch[u][i].i!=0){
if(ch[u][i].k==3)k=dfs(ch[u][i].i,!p);
if(ch[u][i].k==1&&p==0)return 0;
if(ch[u][i].k==2&&p==1)return 0;
if(k)return 0;
//如果p这个人可以获胜,即另一个人不应选u,返回0
}
return 1;
//如果p这个人怎么选都获胜不了,那么另一个人就可以选u,返回1
} signed main(){
cin>>n;
For(i,1,n){
cin>>s;
make(1);//1表示 Nina
} cin>>m;
For(i,1,m){
cin>>s;
make(2);//2表示 Emilija
} For(i,0,25)
if(ch[0][i].i!=0){
ans=dfs(ch[0][i].i,1);
//0表示 Nina
//1表示 Emilija if(ans){//如何可以获胜就输出 Nina
cout<<"Nina";
return 0;
}
}
//如何 Nina怎么选都不能获胜,就输出 Emilija
cout<<"Emilija";
return 0;
}

完成状态

已完成

vlak的更多相关文章

  1. Centos下安装LoadRunner负载机

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAd0AAADfCAIAAAA84J6GAAAgAElEQVR4nJzb93cbR6In+uK/8v6Fd8

随机推荐

  1. lec-6-Actor-Critic Algorithms

    从PG→Policy evaluation 更多样本的均值+Causality+Baseline 减少variance 只要拟合估计Q.V:这需要两个网络 Value function fitting ...

  2. 使用 StarCoder 创建一个编程助手

    如果你是一个软件开发者,你可能已经使用过 ChatGPT 或 GitHub 的 Copilot 去解决一些写代码过程中遇到的问题,比如将代码从一种语言翻译到另一种语言,或者通过自然语言,诸如" ...

  3. 在树莓派上实现numpy的LSTM长短期记忆神经网络做图像分类,加载pytorch的模型参数,推理mnist手写数字识别

    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是LSTM识别mnist手写数字识别 训练代码在电脑上,cpu就能训练,很快的: import torch imp ...

  4. 为什么 Biopython 的在线 BLAST 这么慢?

    用过网页版本 BLAST 的童鞋都会发现,提交的序列比对往往在几分钟,甚至几十秒就可以得到比对的结果:而通过调用 API 却要花费几十分钟或者更长的时间!这到底是为什么呢? NCBIWWW 基本用法 ...

  5. Post-Exploitation Basics

    开发后基础知识 https://tryhackme.com/room/postexploit 使用 mimikatz.bloodhound.powerview 和 msfvenom 学习后期开发和维护 ...

  6. ssh,socat端口转发

    ssh隧道 我们将要研究的第一个协议是SSH,因为它已经内置了通过SSH隧道进行端口转发的功能.虽然SSH曾经是与Linux系统相关联的协议,但现在Windows默认安装了OpenSSH客户端,因此您 ...

  7. 使用Mybatis生成树形菜单-适用于各种树形场景

    开发中我们难免会遇到各种树形结构展示的场景.比如用户登录系统后菜单的展示,某些大型购物网站商品的分类展示等等,反正开发中会遇到各种树形展示的功能,这些功能大概处理的思路都是一样的,所以本文就总结一下树 ...

  8. ChatGPT:在线免费智能聊天网页版

    在当今网络时代,聊天实现了从文字.语音到视频的全面发展.然而,在众多聊天方式中,许多人更喜欢使用人工智能技术来帮助进行自然的对话交流.那么,是否有一个在线免费ChatGPT网页版,可以提供更好的交互体 ...

  9. 【webpack系列】从核心概念到上手配置

    前言 作为前端开发者,相信大家或多或少都接触过webpack,现如今webpack已经渗透在了前端的各个方面,所以我们有必要来了解并学习webpack,webpack 是一种用于构建 JavaScri ...

  10. 无缝数据转换!使用C++ 实现 Excel文件与CSV之间的相互转换

    CSV格式是一种通用的文本文件格式,可在多个应用程序之间共享和使用.相比之下,Excel文件是一种电子表格格式,通常只能在Microsoft Excel中编辑和查看.因此,将Excel文件转换为CSV ...