enc
【问题背景】
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
【样例输出】
ERROR
【样例输入】
ab
ab
c
【样例输出】
ERROR
【样例输入】
abcde
bcdea
cad
【样例输出】
bec
【数据范围与规定】
对于100%的数据,所有字符串长度<=1000。

/*模拟 有特殊情况没想到 如果25个都已经对应好了 剩下的即使不出现也能对应了 90*/
#include<cstdio>
#include<cstring>
#define maxn 1010
using namespace std;
int n,len,f[],g[],falg,c1,c2,A,B;
char s[maxn],s1[maxn],s2[maxn];
int main()
{
freopen("enc.in","r",stdin);
freopen("enc.out","w",stdout);
scanf("%s%s%s",s1,s2,s);
n=strlen(s1);len=strlen(s);
for(int i=;i<n;i++){
if(g[s1[i]]&&g[s1[i]]!=s2[i]){
falg=;break;
}
if(f[s2[i]]&&f[s2[i]]!=s1[i]){
falg=;break;
}
if(f[s2[i]]==)f[s2[i]]=s1[i],c1++;
if(g[s1[i]]==)g[s1[i]]=s2[i],c2++;
}
if(c1==&&c2==){
for(int i='a';i<='z';i++)
if(f[i]==)A=i;
for(int i='a';i<='z';i++)
if(g[i]==)B=i;
f[A]=B;
}
for(int i=;i<len;i++)
if(f[s[i]]==){
falg=;break;
} if(falg){
printf("ERROR\n");return ;
}
for(int i=;i<len;i++)
printf("%c",f[s[i]]);
return ;
}


【问题背景】
zhx 给他的妹子们排序。
【问题描述】
zhx 有 N 个妹子,他对第 i 个妹子的好感度为? ? , 且所有? ? ,两两不相等。现
在 N 个妹子随意站成一排,他要将她们根据好感度从小到大排序。他使用的是
冒泡排序算法(详见下) 。如果排序过程中好感度为? ? 的妹子和好感度为? ? 的妹
子发生了交换,那么她们之间会发生一场口角。
现在 zhx 想知道,给定妹子的初始排列,在排序完成后,最多存在多少个妹
子,她们任意两人之间没发生过口角。
正式地,考虑对数组? ? 进行冒泡排序,如果? ? 和? ? 在排序过程中发生交换,
那么在两个元素之间连一条边。 你需要求出, 排序结束后, 最多存在多少个元素,
其中任意两个元素之间不存在连边。冒牌排序算法如下:
【输入格式】
第一行两个整数 N,表示妹子数量。
接下来一行 N 个整数? ? ,表示初始第 i 个妹子的好感度。
【输出格式】
一行一个整数,表示最多满足要求的妹子的个数。
【样例输入】
3
3 1 2
【样例输出】
2
【样例解释】
{1, 2}。
【数据规模与约定】
316。
70%的数据,1 ≤ ? ≤ 50。
对于100%的数据,1 ≤ ? ≤ 100000, 0 ≤ ? ? < ?。

/*手打个冒泡 把swap的输出出来不难发现就是求LIS*/
#include<cstdio>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,x,c[maxn],num;
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
int main()
{
freopen("sort.in","r",stdin);
freopen("sort.out","w",stdout);
n=init();c[]=-0x7fffffff;
for(int i=;i<=n;i++){
x=init();
if(x>c[num]){
c[++num]=x;continue;
}
int pos=lower_bound(c+,c++num,x)-c;
c[pos]=x;
}
printf("%d\n",num);
return ;
}


【问题背景】
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
【数据规模与约定】
55。
80%的数据,1 ≤ ? ≤ 10。
对于100%的数据,1 ≤ ? ≤ 5000

/*暴力枚举三个点是谁 应该可以80 */
#include<cstdio>
#include<ctime>
#define maxn 5010
using namespace std;
int n,num,head[maxn],ans[maxn][],f[maxn],falg;
struct node{
int v,pre;
}e[maxn*maxn];
char s[maxn][maxn];
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s[i]+);
for(int j=;j<=n;j++)
if(s[i][j]=='')Add(i,j);
}
for(int x=;x<=n;x++){
for(int i=head[x];i;i=e[i].pre){
int y=e[i].v;
for(int j=head[y];j;j=e[j].pre){
int z=e[j].v;
if(s[z][x]==''){
if(f[x]==){
f[x]=;ans[x][]=y;ans[x][]=z;
}
else if(ans[x][]>y){
ans[x][]=y;ans[x][]=z;
}
else if(ans[x][]==y&&ans[x][]>z)
ans[x][]=z;
}
}
}
if(f[x]){
printf("%d %d %d\n",x,ans[x][],ans[x][]);
falg=;break;
}
}
if(!falg)printf("-1\n");
return ;
}
/*
这题真是够了 题目没说清楚
special judge 还没发用
自己打了80分的 应该是没啥问题
然而超时
虽然到最后改成了20 2333
但是自己测试的答案是没问题的
有个spj就好了
说说正解的思想吧
很巧妙地降低了复杂度
首先找环 找到的第一个>=3的环
(其实不会存在2的)
就停下 答案一定在这里面的三个
为什么呢
首先要是环大小为3 这没啥问题
关键是>3的 为什么一定存在合法的 合法的怎么找
这就有套路了
可以自己画个环 因为保证每两人之间都有边
那么无论怎么加边 一定会构成一个三元环
自己动手画画吧 应该很容易看出来 (就是想不到23333)
照这样的的话 那一定有两个是挨着的
但如果枚举两个的话就很慢了
我们只枚举一个 并且把一个固定在起点
我们把起点作为x 枚举的这个作为y 他后面的这个作为z
那么 y->z 一定有边 然后我们加判断 保证 z->x有边
现在就剩下一条了就是x->y的这条 如果这条也确定的话 就构成环了
我们放慢这个枚举的过程来看的话
第一次 x=1 y=2 z=3 这时可以保证 x->y 有边
如果z->x 有边的话 就找到了 停下
如果没有z->x的边 根据两两必有输赢的题意
那一定是x->z 有边
然后我们到下一层 那就保证了x->y 有边了
后面一样的 这里画图脑补一下吧
这样就好了
*/
#include<cstdio>
#include<stack>
#include<vector>
#define maxn 5010
using namespace std;
int n,num,head[maxn],dfn[maxn],low[maxn],f[maxn],falg,top,topt,sum,c[maxn];
stack<int>S;
vector<int>G[maxn];
struct node{
int v,pre;
}e[maxn*maxn];
char s[maxn][maxn];
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Tarjan(int u){
dfn[u]=low[u]=++topt;
f[u]=;S.push(u);
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;
if(dfn[v]==){
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(f[v])low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
while(u!=S.top()){
c[++c[]]=S.top();f[S.top()]=;S.pop();
}
c[++c[]]=S.top();f[S.top()]=;S.pop();
if(c[]<)c[]=;
else {
sum++;falg=;
for(int i=c[];i>=;i--)
G[sum].push_back(c[i]);
}
}
}
void Printf(){
for(int k=;k<=sum;k++)
if(G[k].size()>=){
int x,y,z;x=G[k][];
for(int i=;i<G[k].size()-;i++){
y=G[k][i];z=G[k][i+];
if(s[z][x]==''){
printf("%d %d %d\n",x,y,z);break;
}
}
break;
}
}
int main()
{
freopen("game.in","r",stdin);
freopen("game.ans","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s[i]+);
for(int j=;j<=n;j++)
if(s[i][j]=='')Add(i,j);
}
for(int i=;i<=n;i++){
if(dfn[i]==)Tarjan(i);
if(falg){
Printf();break;
}
}
if(!falg)printf("-1\n");
return ;
}

10.26 noip模拟试题的更多相关文章

  1. 10.27 noip模拟试题

    1.铺瓷砖(tile.cpp/c/pas)[问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行 ...

  2. 10.24 noip模拟试题

    尼玛pdf依旧不会粘23333 /* 每段合并到总的里面 假设总的有X个 这一段有Y个 一共有X+1个空 那么就有 C(X+1,1)+C(X+1,2)+C(X+1,3)+...+C(X+1,Y) 这样 ...

  3. 10.18 noip模拟试题

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  4. 10.13 noip模拟试题

    Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship ...

  5. 10.11 noip模拟试题

    4题均为128M,1s 1. 锻炼计划(exercise.pas) 身体是革命的本钱,OIers不要因为紧张的学习和整天在电脑前而忽视了健康问题.小x设计了自己的锻炼计划,但他不知道这个计划是否可行, ...

  6. 10.8 noip模拟试题

      1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的 ...

  7. 10.6 noip模拟试题

    更正:第三组:不存在相同的字符|str|=26,26<=n<=100 60 /* 呵呵哒~这题 正解还在研究.... 因为没有题解只有个std还在看 不过乱搞一下可以70(数据好像有问题只 ...

  8. 10.4 noip模拟试题

    题目名称 PA 青春 三部曲 名称 huakai taritari truetears 输入 huakai.in taritari.in truetears.in 输出 huakai.out tari ...

  9. 10.3 noip模拟试题

    希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“ ...

随机推荐

  1. ALTER TABLE 语句与 FOREIGN KEY 约束"FK_SCHEDULE_REFERENCE_POSTCONF"冲突。

    主要原因是因为两个表中有数据不匹配,只要把不匹配的数据删掉就行了.

  2. bzoj 1014: [JSOI2008]火星人prefix hash && splay

    1014: [JSOI2008]火星人prefix Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3154  Solved: 948[Submit][ ...

  3. bzoj 3287: Mato的刷屏计划 高精水题 && bzoj AC150

    3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Desc ...

  4. BZOJ 3680 吊打XXX

    Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞 ...

  5. SysErrorMessage 函数和系统错误信息表

    在看 API 文档时, 我们经常见到 GetLastError; 它可以返回操作后系统给的提示.但 GetLastError 返回的只是一个信息代码, 如何返回对应的具体信息呢?FormatMessa ...

  6. 如何快速使用ECharts绘制可视化图表

    1.在ECharts官网,下载ECharts的源码和示例文件. 2.解压缩下载下来的Echars压缩包,找到doc\example\www\echartsjs目录,将里面的js文件全部取出来,放到项目 ...

  7. Robotium跨应用处理方法

    相信用过一段时间Robotium的同学一般都遇到过如下情况:界面跳转到被测程序外以后,Robotium就毫无对策了,这也是Instrumentation框架最致命的一个缺点;然而领导是不会管你这些很“ ...

  8. vs默认的app.config是哪个?

    一:这次是进一步的三层构架,不过还是没有业务逻辑层,但有单独的层的文件夹,解决方案资源管理器图如下: 二:operatorDAl.cs代码: using System; using System.Co ...

  9. IE的表头固定/表头不动(使用expression)

    本文主要介绍在IE浏览器中,实现表头固定的一种方法.这种方法使用到了 IE 浏览器特有的 expression 方法. 表头固定DEMO1 主要代码: <style type="tex ...

  10. php将SQL查询结果赋值给变量

    2012-03-25 12:12 a786013819 | 分类:数据库DB | 浏览1393次 $sql = "select field1 from pre_common_member_p ...