连这种模拟题都能。。。orz

ex,太恶心了!

驰骋坑底这么久了,我明白了


开始吧!我发誓,这个超级兵,我就算用小书包平A都要A了它

题目

Vlatko喜欢使用整数数组,他在一张纸上写下了两个数组,每个数组一共n个元素。每一个元素可以是一个正整数,也可以是由一串小写英文字母组成的字符串。由英文字母组成的序列可以替换为任意整数,如果同一字符串出现多次,那么这些字符串都必须用相同的整数进行替换。

Vlatko想知道是否可以用一些整数来替换所有的字符串,使得两个数组相同。如果数组相同位置上的数字相同,则认为两个数组相同。

输入格式
第一行包含一个正整数n(1≤n≤50000),即每个数组中的元素数。
第二行包含第一个数组的n个元素。
第三行包含第二个数组的n个元素。

两个数组中的每个元素都可以是:
1)小于1000的正整数或
2)表示变量的英文字母(不超过10个字符)的小写字母字符串

输出格式
如果两个字符串可能相同,则输出”DA”,否则,输出”NE”。

样例
样例输入1
3
3 1 2
3 1 x
样例输出1
DA
样例输入2
4
4 5 iks ipsilon
1 iks 3 iks
样例输出2
NE
样例输入3
5
x 3 x y 3
x y 2 z 3
样例输出3
DA
数据范围与提示
在样例3中,答案的解为x=2,y=3,z=3,此时两个数组相等(2,3, 2, 3, 3)

题解

这道题没有用到任何的知识点,你只要会用map会打include就可以了!
这道题就是一个纯纯的裸裸的的没有装饰的模拟题,矛盾就可以直接return 0
然而我爆零!orz

首先模拟考虑的几种NE情况:
1.当ai,bi都是数字并且不相同
2.ai,bi其中有一个是数字,另一个是字母但是已经处理出了值,且与数字不相同
3.两个都是字母,这个情况比较难搞!
(1)两个字母都还没有被处理,都是可变化的,这个时候我们要先勇敢跳过
(2)两个字母都已经处理,并且值不相同
(3)有一个字母被处理了,另外一个字母可变化,这个时候就可以确定那个字母了

在一重循环之后,我们不能确定每一个字母都已经处理好了,
而且可能遇到以下几种变态情况(卡了我n天啊!orz)
举个栗子
1 b c d
b c d 2 这样一个一个顺次对应
a b c d 2
2 a b c d这样一个一个逆次对应
a b c d 1 e f g h
z a b c d f g h d 这样从中间断开顺逆对应

就是每一次循环只能更新出一个字母的极限情况,意思到了就行了!

而且为了get到这个字母可能与那些字母成为对应关系,我们就要用map套一个vector去存储

你想想当n足够大的时候,是不是要从头和从尾都为起点跑一次,那这样再循环中还要处理vector,
跟个两重循环一样,不T,天理不容

所以这一块一定要想个优化,因为我们每次都是0~size-1进行循环处理,所以一旦这个父亲有值过后,
一次循环就能让这些0~size-1都有值,那么下一次碰到他们的时候,就没有必要花个时间再询问一遍
加个break,就能优化过AC!!
这个还是本仙女昨天想睡觉临门一脚给想到的!!我都要拜倒在自己的石榴裙下了!!

这道题当然可以用并查集A,听说代码量也不是很黑人,但是我不会!尴尬ing
大佬们可以去写写,然后教教我这个无知的人!

直接上马!

代码实现

#include <map>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
#define MAXN 50005
map < string, int > flag;
map < string, vector < string > > G;
bool isnum ( char x ) {if ( x >= '0' && x <= '9' ) return 1;return 0;
}
int n;
string a[MAXN], b[MAXN];
int main() {scanf ("%d", &n );for ( int i = 1;i <= n;i ++ )cin >> a[i];for ( int i = 1;i <= n;i ++ )cin >> b[i];for ( int i = 1;i <= n;i ++ ) {if ( isnum ( a[i][0] ) && isnum( b[i][0] ) ) {if ( a[i] != b[i] ) return ! printf ( "NE" );}else {if ( isnum ( a[i][0] ) && ! isnum ( b[i][0] ) ) {int num = 0, len = a[i].length();for ( int j = 0;j < len;j ++ )num = ( num << 1 ) + ( num << 3 ) + ( a[i][j] - '0' );if ( flag[b[i]] && flag[b[i]] != num )return ! printf ( "NE" );flag[b[i]] = num;for ( int j = 0;j < G[b[i]].size();j ++ ) {if ( flag[G[b[i]][j]] && flag[G[b[i]][j]] != flag[b[i]] )return ! printf ( "NE" );else if ( flag[G[b[i]][j]] == flag[b[i]] ) break;flag[G[b[i]][j]] = flag[b[i]];}}else {if ( ! isnum ( a[i][0] ) && isnum ( b[i][0] ) ) {int num = 0, len = b[i].length();for ( int j = 0;j < len;j ++ )num = ( num << 1 ) + ( num << 3 ) + ( b[i][j] - '0' );if ( flag[a[i]] && flag[a[i]] != num )return ! printf ( "NE" );flag[a[i]] = num;for ( int j = 0;j < G[a[i]].size();j ++ ) {if ( flag[G[a[i]][j]] && flag[G[a[i]][j]] != flag[a[i]] )return ! printf ( "NE" );else if ( flag[G[a[i]][j]] == flag[a[i]] ) break;flag[G[a[i]][j]] = flag[a[i]];}}else {G[a[i]].push_back ( b[i] );G[b[i]].push_back ( a[i] );}}}}for ( int i = n;i >= 1;i -- ) {if ( ! isnum ( a[i][0] ) && ! isnum( b[i][0] ) ) {if ( flag[a[i]] && flag[b[i]] && flag[a[i]] != flag[b[i]] ) return ! printf ( "NE" );if ( ! flag[a[i]] && ! flag[b[i]] ) continue;if ( flag[a[i]] ) flag[b[i]] = flag[a[i]];else flag[a[i]] = flag[b[i]];for ( int j = 0;j < G[a[i]].size();j ++ ) {if ( flag[G[a[i]][j]] && flag[G[a[i]][j]] != flag[a[i]] )return ! printf ( "NE" );else if ( flag[G[a[i]][j]] == flag[a[i]] ) break;flag[G[a[i]][j]] = flag[a[i]];}for ( int j = 0;j < G[b[i]].size();j ++ ) {if ( flag[G[b[i]][j]] && flag[G[b[i]][j]] != flag[b[i]] )return ! printf ( "NE" );else if ( flag[G[b[i]][j]] == flag[b[i]] ) break;flag[G[b[i]][j]] = flag[b[i]];}}if ( ! isnum ( a[i][0] ) && isnum ( b[i][0] ) ) {int num = 0, len = b[i].length();for ( int j = 0;j < len;j ++ )num = ( num << 1 ) + ( num << 3 ) + ( b[i][j] - '0' );if ( ! flag[a[i]] ) flag[a[i]] = num;if ( flag[a[i]] != num ) return ! printf ( "NE" );for ( int j = 0;j < G[a[i]].size();j ++ ) {if ( flag[G[a[i]][j]] && flag[G[a[i]][j]] != flag[a[i]] )return ! printf ( "NE" );else if ( flag[G[a[i]][j]] == flag[a[i]] ) break;flag[G[a[i]][j]] = flag[a[i]];}}if ( ! isnum ( b[i][0] ) && isnum ( a[i][0] ) ) {int num = 0, len = a[i].length();for ( int j = 0;j < len;j ++ )num = ( num << 1 ) + ( num << 3 ) + ( a[i][j] - '0' );if ( ! flag[b[i]] ) flag[b[i]] = num;if ( flag[b[i]] != num ) return ! printf ( "NE" );for ( int j = 0;j < G[b[i]].size();j ++ ) {if ( flag[G[b[i]][j]] && flag[G[b[i]][j]] != flag[b[i]] )return ! printf ( "NE" );else if ( flag[G[b[i]][j]] == flag[b[i]] ) break;flag[G[b[i]][j]] = flag[b[i]];}}}for ( int i = 1;i <= n;i ++ ) {if ( ! isnum ( a[i][0] ) && ! isnum( b[i][0] ) ) {if ( flag[a[i]] && flag[b[i]] && flag[a[i]] != flag[b[i]] ) return ! printf ( "NE" );if ( ! flag[a[i]] && ! flag[b[i]] ) continue;if ( flag[a[i]] ) flag[b[i]] = flag[a[i]];else flag[a[i]] = flag[b[i]];for ( int j = 0;j < G[a[i]].size();j ++ ) {if ( flag[G[a[i]][j]] && flag[G[a[i]][j]] != flag[a[i]] )return ! printf ( "NE" );else if ( flag[G[a[i]][j]] == flag[a[i]] ) break;flag[G[a[i]][j]] = flag[a[i]];}for ( int j = 0;j < G[b[i]].size();j ++ ) {if ( flag[G[b[i]][j]] && flag[G[b[i]][j]] != flag[b[i]] )return ! printf ( "NE" );else if ( flag[G[b[i]][j]] == flag[b[i]] ) break;flag[G[b[i]][j]] = flag[b[i]];}}if ( ! isnum ( a[i][0] ) && isnum ( b[i][0] ) ) {int num = 0, len = b[i].length();for ( int j = 0;j < len;j ++ )num = ( num << 1 ) + ( num << 3 ) + ( b[i][j] - '0' );if ( ! flag[a[i]] ) flag[a[i]] = num;if ( flag[a[i]] != num ) return ! printf ( "NE" );for ( int j = 0;j < G[a[i]].size();j ++ ) {if ( flag[G[a[i]][j]] && flag[G[a[i]][j]] != flag[a[i]] )return ! printf ( "NE" );else if ( flag[G[a[i]][j]] == flag[a[i]] ) break;flag[G[a[i]][j]] = flag[a[i]];}}if ( ! isnum ( b[i][0] ) && isnum ( a[i][0] ) ) {int num = 0, len = a[i].length();for ( int j = 0;j < len;j ++ )num = ( num << 1 ) + ( num << 3 ) + ( a[i][j] - '0' );if ( ! flag[b[i]] ) flag[b[i]] = num;if ( flag[b[i]] != num ) return ! printf ( "NE" );for ( int j = 0;j < G[b[i]].size();j ++ ) {if ( flag[G[b[i]][j]] && flag[G[b[i]][j]] != flag[b[i]] )return ! printf ( "NE" );else if ( flag[G[b[i]][j]] == flag[b[i]] ) break;flag[G[b[i]][j]] = flag[b[i]];}}}printf ( "DA" );return 0;
}

啊~AC了这道题,世界都有了光彩,真香!这里是决心把品牌做进世界前五百强的现场,
欢迎致电139红酒白酒葡萄酒!

有任何问题,欢迎留言,xgg,xjj我们再见哦~

[COCI] Zamjena相关推荐

  1. [COCI2015]COCI

    [COCI2015]COCI 题目大意: 有\(n(n\le5\times10^5)\)个人比赛,比赛总共进行\(3\)轮,每一轮得分为\([0,650]\)内的整数.现在已经得知每个人前两轮的成绩. ...

  2. [COCI 2017-2018-2]-San

    [COCI 2017-2018-2]-San san(1s64M) 游戏世界中有N个楼从左到右排列,从左到右编号为1到N,第i幢楼的高度为Hi,楼上的金币数为Gi,游戏可以从任意一个楼开始且包涵几步. ...

  3. 【COCI 2018/2019 Round #2】Kocka

    这道题也是一个ex的模拟题 不过他比Zamjena可爱 作为一个帅气的小哥哥,让我们一起, 开启你的模拟ex大门,C++从入门到放弃! 题目 题目描述 我又来了!我又来了! 在清晨来到儿童游乐园的时候 ...

  4. 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树

    题目传送门: 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树 题目描述 伐木工人 Mirko 需要砍 M 米长的木材.对 Mirko 来说这是很简单的工作,因为他有一个漂亮 ...

  5. 洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树(二分法)

    题目链接 : 洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 文章目录 前言 一.题目 题目描述 输入格式 输出格式 输入输出样例 说明/提示 二.代码 前言 第一次写博客, ...

  6. 【C++】洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树

    [COCI 2011/2012 #5] EKO / 砍树 题目描述 伐木工人 Mirko 需要砍 MMM 米长的木材.对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍 ...

  7. 寒假作业:COCI 2014/2015题选 题目与题解

    目录 T1 MAFIJA 题目 题解 T2 ZABAVA 题目 题解 T3 KAMP 题目 题解 T4 BOB 题目 题解 T5 SUMA 题目 题解 T6 NORMA 题目 题解 T7 COCI 题 ...

  8. 《二分答案》—— P1873 [COCI 2011/2012 #5] EKO / 砍树

    [COCI 2011/2012 #5] EKO / 砍树 题目描述 伐木工人 Mirko 需要砍 M M M 米长的木材.对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一 ...

  9. COCI 2018/2019 CONTEST #2 T4 Maja T5Sunčanje Solution

    COCI 2018/2019 CONTEST #2 T4 T5 Solution abstract 花式暴力 #2 T5 Sunčanje 题意 按顺序给你1e5个长方形(左下角坐标&& ...

最新文章

  1. 【python技巧】“”、“”等符号操作
  2. 多平台支持:下一步容器技术热点
  3. feign调用第三方接口_讲一个你不知道的事:SringCloud的feign的继承特性
  4. vue 简介 vue 项目
  5. [CodeForces - 950D]A Leapfrog in the Array(思维)
  6. 人生轨迹的改变,首要在于思维方式的改变。--转贴 CSDN.NET公司内部论坛:迈向成功的“脑力操”...
  7. aix服务器端口配置文件,aix系统查看端口号
  8. 最全的常用正则表达式--包含校验数字、字符、一些特殊的需求等等
  9. 长期不上班,人会废掉吗?
  10. oracle 先决条件失败,linux安装oracle先决条件检查全部失败
  11. 隐马尔科夫模型(HMM)学习笔记二
  12. 关于给hexo博客增加每日一言(诗句,影视名句,网易云热评等)
  13. 2020年广东省中高级工程师职称评定条件要求和通知
  14. 素数总结(包含素数表)
  15. 京东数科:无偿驰援 多款智能产品服务防控第一线
  16. STM8S103 105唯一序列码的读取
  17. 大数据方向可以找什么工作
  18. matlab中scale,Scale功能的Matlab实现
  19. Android 相机 或者 相册 获取图片裁剪 适用6.0/7.0
  20. 2021015979李庚奇实验二

热门文章

  1. wdcp服务器/虚拟主机管理系统,wdcp服务器/虚拟主机管理系统1.1发布(最后更新20110423)...
  2. java foreach 跳过本次循环_【Java】对foreach循环的思考
  3. java try finally connectoin close_Java SocketChannel類代碼示例
  4. 登录服务器修改数据库吗,如何修改服务器登录数据库 sa
  5. 用python可以处理xml文件怎么打开_Python大神都是这样处理xml文件的!
  6. 计算机bq,BQ24721部分翻译
  7. Linux链接文件包括,Linux操作系统——系统各目录有什么作用、以及文件链接过程...
  8. 三菱四节传送带控制梯形图_一文讲透FX5U PLC程序控制指令及步进梯形图编程
  9. leetcode150. 逆波兰表达式求值
  10. 435. 无重叠区间(贪心经典题+思路+详解)