话说这次题目质量好像高了不少。
以下,记一个蒟蒻的故事…
T1 迷
【 问题背景】zhx 和他的妹子聊天。
【 问题描述】
考虑一种简单的加密算法。
假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母。例如考虑映射规则:
a->b,b->c,c->d,d->a.那么单词 bad 就会被映射为 cba。这个映射规则的“逆映射规则”为:b->a, c->b,d->c,a->d。对于密文cba,我们很容易将它解密为bad。
当然,这样的映射需要保证每一个字母映射到的字母是不同的(即不可以出现两个不同的字母映射到同一个字母,否则将会无法解密)。
一种常见的密码攻击方式被称为已知明文攻击。具体地,在你不知道映射表的情况下,给你一段明文和对应的密文,你可以推导出一些的映射规则,下一次你收到一条密文,你就可能可以解密它。现在你需要完成这样的一个系统。【输入格式】
第一行包含一个字符串, 仅包含小写字母, 表示一段明文。
第二行包含一个字符串, 仅包含小写字母, 表示这段明文对应的密文, 保证两行长度相同。
第三行包含一个字符串,仅包含小写字母, 表示你需要解密的密文。【输出格式】
输出共一行, 表示输入中第三行密文对应的明文。 如果不能解密, 输出“ERROR”(不包含引号)。注意输入可能出现不自恰的情况。
【样例输入】
ab
cc
ccab
ab
cabcde
bcdea
cad【样例输出】
ERROR
ERROR
bec【数据范围与规定】
对于100%的数据, 所有字符串长度<=1000。
Solution:
模拟,模拟,模拟。
但这题有一个神坑:当25个字母都已经一一对应完毕后,剩下的两个字母默认对应。
附图一张,事后证明出题者处心积虑的防AK大法还是起到了很大作用的。其实这个点没有一个人A。
因为没有A所以没有代码
T2 序
【问题背景】zhx 给他的妹子们排序。
【问题描述】
zhx有N个妹子,他对第i个妹子的好感度为 ai , 且所有 ai ,两两不相等。现在N个妹子随意站成一排,他要将她们根据好感度从小到大排序。他使用的是冒泡排序算法(详见下)。如果排序过程中好感度为 ai 的妹子和好感度为 aj 的妹子发生了交换, 那么她们之间会发生一场口角。
现在zhx想知道,给定妹子的初始排列,在排序完成后,最多存在多少个妹子,她们任意两人之间没发生过口角。
正式地,考虑对数组 ai 进行冒泡排序,如果 ai 和 aj 在排序过程中发生交换,那么在两个元素之间连一条边。你需要求出,排序结束后,最多存在多少个元素,其中任意两个元素之间不存在连边。冒泡排序算法如下:
【输入格式】
第一行两个整数 N,表示妹子数量。
接下来一行 N 个整数 ai ,表示初始第 i 个妹子的好感度。【输出格式】
一行一个整数, 表示最多满足要求的妹子的个数
【样例输入】
3
3 1 2【样例输出】
2
【样例解释】
{1, 2}。
【数据规模与约定】
对于30%的数据, 1 ≤ N ≤ 16。
对于70%的数据, 1 ≤ N ≤ 5000。
对于100%的数据, 1 ≤ N ≤ 100000, 0 ≤ ai < N。
Solution:
所有的逆序对之间都会连边,求最大独立点集。
表面上是个图论题,其实是个LIS…
dp方程:
身为蒟蒻的我写出了方程却还没发现这是LIS,于是果断敲了一个线段树。
不写对拍,浪的飞起,果断爆0。
T3 戏
【问题背景】zhx 和他的妹子( 们) 做游戏。
【问题描述】
考虑 N 个人玩一个游戏,任意两个人之间进行一场游戏(共 N*(N-1)/2 场),且每场一定能分出胜负。
现在, 你需要在其中找到三个人构成“剪刀石头步”局面: 三个人 A,B,C 满足 A 战胜 B,B 战胜 C,C 战胜 A。【输入格式】
第一行一个正整数 N, 表示参加游戏的人数。
接下来 N 行, 每行 N 个数 0/1,中间没有空格隔开。第 i 行第 j 列数字为 1 表示 i 在游戏中战胜了 j。 所有对角线元素( 即第 i 行第 i 个元素) 为 0, 保证数据合法。【输出格式】
如果存在三个人构成“剪刀石头布”局面, 输出三个人的编号(人的编号从 1 开始)。
如果不存在这样的三个人, 输出一个数-1。【样例输入】
5
00100
10000
01001
11101
11000【样例输出】
1 3 2
【数据规模与约定】
对于50%的数据, 1 ≤ N ≤ 500。
对于80%的数据, 1 ≤ N ≤ 1000。
对于100%的数据, 1 ≤ N ≤ 5000。
Solution:
好棒的题…(来自一个蒟蒻的评价)
O(n3)
不必讲了,直接讲正解。
首先这是一个神奇的图,叫做竞赛图。大概定义就是每两点之间都有且仅有一条有向边,看这题就非常好理解了。
竞赛图有一个很好的性质:只要存在环,环中点的个数就一定大于等于3个。
证明:
根据定义,一元环和二元环显然不存在。
于是考虑多元环:
我们知道在2与6之间会有一条边,如果这条边从2指向6,那么就形成了1-2-6三元环,否则我们会发现原本的六元环变成了6-2-3-4-5组成的五元环,环变小了。
当这个环缩小到四元环时,显然2与4之间的连线无论是哪个方向都会形成三元环。
证毕。
然后我们的思路就清晰了:找到一个环,然后按照上述方式即可输出结果。
找环的方式则可以采用dfs:
选定一个
mark[i]=−1
(没有被遍历过)的点,以它为根向下dfs,将沿途上的点mark值设为1,若再次访问则就找到环了。
因为没有A所以没有代码