【算法竞赛进阶指南】POJ 3349 —— SnowflakeSnowSnowflakes

该博客探讨了一道算法竞赛题目,涉及判断给定的多个雪花形状是否相同。雪花由六个长度不同的角构成,形状相同意味着能从任意角度出发找到相同的角长度序列。题目要求在10^5个雪花中找出是否有重复的形状。解决方案可能涉及到数据结构如邻接表的使用。
摘要由CSDN通过智能技术生成
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值