POJ 3349 Snowflake Snow Snowflakes

题意:一个长度为6的序列表示一片雪花的六个胳膊(?)的长度,给出n个雪花,问存不存在两片一样的,一样的就是两个雪花旋转或者翻转后胳膊的长度是一样的……

解法:哈希。以前并没有做过对数字序列哈希……先用map搞了搞,然后T了……百度了一下,只要将序列元素和进行哈希就可以了,对于索引的选取,一开始选了10n+7,然而T了……不是说越大哈希完了越分散么……想了想觉得是因为用vector搞的初始化太耗时……于是把索引减小吧……5003是个不错的选择……嗯?我怎么知道的?哈哈哈哈当然是我过于机智……嗯?你说什么?

…………才……才不是试出来的!

好吧……

如果不用vector的话应该可以更优化……但是用vector实在太方便了嘤嘤嘤_(:з」∠)_

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
const int mod = 5003;
const int N = 5010;
struct node
{
    int a[6];
};
vector <node> sf[N];
bool isequal(node a, node b)
{
    for(int i = 0; i < 6; i++)
    {
        int flag = 1;
        for(int j = 0; j < 6; j++)
            if(a.a[j] != b.a[(j + i) % 6])
            {
                flag = 0;
                break;
            }
        if(flag) return true;
        flag = 1;
        for(int j = 0; j < 6; j++)
            if(a.a[j] != b.a[(11 - i - j) % 6])
            {
                flag = 0;
                break;
            }
        if(flag) return true;
    }
    return false;
}
int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        for(int i = 0; i < N; i++)
            sf[i].clear();
        bool ans = 0;
        for(int i = 0; i < n; i++)
        {
            node tmp;
            int sum = 0;
            for(int j = 0; j < 6; j++)
            {
                scanf("%d", &tmp.a[j]);
                sum += tmp.a[j];
            }
            sum %= mod;
            if(sf[sum].size())
            {
                int len = sf[sum].size();
                for(int j = 0; j < len & !ans; j++)
                    if(isequal(tmp, sf[sum][j])) ans = 1;
            }
            sf[sum].push_back(tmp);
        }
        if(ans) puts("Twin snowflakes found.");
        else puts("No two snowflakes are alike.");
    }
    return 0;
}

  

时间: 2024-11-05 09:24:33

POJ 3349 Snowflake Snow Snowflakes的相关文章

poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accepted: 8033 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Y

hash应用以及vector的使用简介:POJ 3349 Snowflake Snow Snowflakes

今天学的hash.说实话还没怎么搞懂,明天有时间把知识点总结写了,今天就小小的写个结题报告吧! 题意: 在n (n<100000)个雪花中判断是否存在两片完全相同的雪花,每片雪花有6个角,每个角的长度限制为1000000 两片雪花相等的条件: 雪花6个角的长度按顺序相等(这个顺序即可以是顺时针的也可以是逆时针的) 解题思路: hash:连加求余法 求key 值,链地址法解决冲突,连加求余法 求key 值挺简单,关于链地址法解决冲突可以通过c++中,vector容器可以较为方便的实现. 下面先介绍

POJ 3349 Snowflake Snow Snowflakes (哈希表)

题意:每片雪花有六瓣,给出n片雪花,六瓣花瓣的长度按顺时针或逆时针给出,判断其中有没有相同的雪花(六瓣花瓣的长度相同) 思路:如果直接遍历会超时,我试过.这里要用哈希表,哈希表的关键码key用六瓣花瓣的长度的和取余一个数得到,表中为雪花的存储位置address(即在snowflakes数组中的位置) 代码: #include<iostream> #include<vector> using namespace std; const int maxn=100000+100;//雪花最

POJ 3349 Snowflake Snow Snowflakes(哈希表)(转)

题意:判断有没有两朵相同的雪花.每朵雪花有六瓣,比较花瓣长度的方法看是否是一样的,如果对应的arms有相同的长度说明是一样的.给出n朵,只要有两朵是一样的就输出有Twin snowflakes found.,如果任何两个都是不一样的输出No two snowflakes are alike.n=100,000. 思路:最 简单的就是枚举每两片雪花,判断他们是否相同.时间复杂度为O(n*n),显然效果不理想.有没有更好的算法呢?hash:每读进一片雪花,将雪花 hash,判断hash表里是否有相同

哈希—— POJ 3349 Snowflake Snow Snowflakes

相应POJ题目:点击打开链接 Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 33595   Accepted: 8811 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is

[ACM] POJ 3349 Snowflake Snow Snowflakes(哈希查找,链式解决冲突)

Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30512   Accepted: 8024 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Y

POJ 3349 - Snowflake Snow Snowflakes - [hash]

题目链接:http://poj.org/problem?id=3349 Time Limit: 4000MS Memory Limit: 65536K Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Your program will read information

POJ - 3349 Snowflake Snow Snowflakes (哈希)

题意:给定n(0 < n ≤ 100000)个雪花,每个雪花有6个花瓣(花瓣具有一定的长度),问是否存在两个相同的雪花.若两个雪花以某个花瓣为起点顺时针或逆时针各花瓣长度依次相同,则认为两花瓣相同. 分析: 1.按雪花各花瓣长度之和对MOD取余哈希.对各雪花,算出哈希值,在哈希表中查询是否有与之相同的花瓣. 2.每个花瓣以某个花瓣为起点顺时针或逆时针共有12种表示方法. 3.注意哈希表中只需保存雪花输入时给定的那组长度值即可. 在哈希表中查询时,再算出该组长度值所对应的12种表示,并一一比较,若

POJ 3349 Snowflake Snow Snowflakes 哈希(链式解决冲突)

题意:n个数列 每个数列6个元素a[i],a[i]<=1e7,两个数列只要,经过若干次循环移动能相等则定义为相似.n<=1e5,问n个数列中 是否存在两个数列相似? 每个数列只有6个数,则相似的最多12种,对每个数列算出其hash值 相同hash值插入同一个链表中.查看新输入的数列插入时是否产生冲突即可 O(n*12) #include <iostream> #include <cstdio> #include <cstring> #include <