acwing 腾讯 2021秋招在线笔试(9.6场) 哈希表签到题

it2025-02-25  27

题目描述

有一个圆环上面有6个点,每一个点都有一个数字,对于两个圆环来说,若6个数字完全一致(顺序可以随 机,只要数相同即可),则说明这两个圆环是一样的,现在有n 个圆环,想问你这里面有没有一样的两 个圆环,若有输出YES,否则输出NO。

输入描述

第一行输入一个整数T ,代表有T组测试数据。 对于每一组测试数据,第一行输入一个整数n,代表有n个圆环。 接下来n

行,每一行6个整数代表每一个圆环的6个点的值。

1≤T≤100

1≤n≤105

圆环的每一个值的大小都小于105 ,且每一个文件内的n的总和不超过106

输出描述

对于每组测试数据:若有两个一样的输出YFS,否则输出NO。 示例1

样例输入

2 2 1 2 3 4 5 6 2 3 4 5 6 1 3 1 2 3 4 5 6 8 5 4 1 2 3 2 3 4 5 6 7

样例输出

YES NO

算法

作者:xnuohz 链接:https://www.acwing.com/file_system/file/content/whole/index/content/1274065/#comment_50110 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


无聊逛ACwing的分享区看到的题,今天没写题,所以水一篇博客 链接https://www.acwing.com/file_system/file/content/whole/index/content/1274065/#comment_50110


简单题,用hash表判重即可

由于数字只有6位,即使翻两倍也才12位,所以我们用long long来存储环把原数字拼到自己后面就是环了x = x*1000000+x 比如x=123456,x*1000000=123456000000,x*1000000+x=123456123456我们把x%1000000放入hash表即可,放入后x/=10接着放即可 read(Q); while(Q--) { read(n); unordered_set<ll> vis; int ans = 0; for(int i=1; i<=n; i++) { ll val = 0, x, tmp; for(int j=0; j<6; j++) { read(x); val = val * 10 + x; } val = val * 1000000 + val; tmp = val; while(tmp > 0) { ans = ans || (vis.count(tmp%1000000)); tmp /= 10; } while(val > 0) { vis.insert(val%1000000); val /= 10; } } printf("%s\n", ans ? "YES" : "NO"); }
最新回复(0)