Description
有N片雪花,每片雪花由六个角组成,每个角都有长度。第i片雪花六个角的长度从某个角开始顺时针依次记为ai1,ai2,…,ai6。
因为雪花的形状是封闭的环形,所以从任何一个角开始顺时针或逆时针往后记录长度,得到的六元组都代表形状相同的雪花。
例如ai1,ai2,…,ai6和ai2,ai3,…,ai6,ai1就是形状相同的雪花。
ai1,ai2,…,ai6和ai6,ai5,…,ai1也是形状相同的雪花。
我们称两片雪花形状相同,当且仅当它们各自从某一角开始顺时针或逆时针记录长度,能得到两个相同的六元组。
求这N片雪花中是否存在两片形状相同的雪花。
Input
第一行输入一个整数N,代表雪花的数量。
接下来N行,每行描述一片雪花。每行包含6个整数,分别代表雪花的六个角的长度(这六个数即为从雪花的随机一个角顺时针或逆时针记录长度得到)。
同行数值之间,用空格隔开。
数据范围:
1 ≤ n ≤ 10^5 ,
0 ≤ aij < 10^7
Output
如果不存在两片形状相同的雪花,则输出:No two snowflakes are alike.
如果存在两片形状相同的雪花,则输出:Twin snowflakes found.
Sample Input
2
1 2 3 4 5 6
4 3 2 1 6 5
Sample Output
Twin snowflakes found.
vector构造邻接表
#include <cstdio>
#include <vector>
using namespace std;
using ll = long long;
const int p = 1e5+3; // p可以是任意比较大的素数,太小(如131)会相当于普通数组导致超时
vector<vector<int> > head[p+5];
// 求雪花a的哈希值
int H(vector<int> a)
{
// 对于6个数都相同的雪花,他们6个数之和、6个数之积都应该相等
// 构造的哈希方法很多
// 比如:
int sum = 0, mul = 1;
for (int i = 0