Tyvj NOIP全真模拟系列赛(2)游记

话说这次题目质量好像高了不少。
以下,记一个蒟蒻的故事…

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
cc

ab
ab
c

abcde
bcdea
cad

【样例输出】

ERROR
ERROR
bec

【数据范围与规定】

对于100%的数据, 所有字符串长度<=1000。

Solution:
模拟,模拟,模拟。
但这题有一个神坑:当25个字母都已经一一对应完毕后,剩下的两个字母默认对应
附图一张,事后证明出题者处心积虑的防AK大法还是起到了很大作用的。其实这个点没有一个人A。
T1
因为没有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方程:

dp[i]=max(dp[j]+1)(j<i,A[j]<A[i])

身为蒟蒻的我写出了方程却还没发现这是LIS,于是果断敲了一个线段树。
不写对拍,浪的飞起,果断爆0。
因为没有A所以没有代码

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,若再次访问则就找到环了。
dfs
因为没有A所以没有代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值