poj--3349 Snowflake Snow Snowflakes(哈希)

来源:互联网 发布:mac忘记admin密码 编辑:程序博客网 时间:2024/05/21 08:59

problem link

题解

判断是否有两片雪花相同。。
对每一雪花的六个值求和进行哈希,这样判断两片雪花相同就只需要在相同的哈希值下进行。

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>using namespace std;const int maxn = 100000 + 5;const int mod  = 100003;int snowflake[maxn][6];int n;vector<int> Hash[maxn];bool check(int x, int y){    bool flag = false;    for(int i = 0; i < 6; ++i){        if(snowflake[x][0] == snowflake[y][i]){            int j;            for(j = 1; j < 6; ++j){                if(snowflake[x][j] != snowflake[y][(i + j) % 6]) break;            }            if(j == 6) flag = true;            for(j = 1; j < 6; ++j){                if(snowflake[x][6 - j] != snowflake[y][(i + j) % 6]) break;            }            if(j == 6) flag = true;        }    }    return flag;}int main(){#ifndef ONLINE_JUDGEfreopen("data.in", "r", stdin);#endif // ONLINE_JUDGE    // 6308K    3563MS    while(cin >> n){        bool flag = false;        for(int i = 0; i < n; ++i){            int sum = 0;            for(int j = 0; j < 6; ++j){                scanf("%d", &snowflake[i][j]);                sum += snowflake[i][j];            }            sum %= mod;            for(int j = 0; j < Hash[sum].size(); ++j){                if(check(Hash[sum][j], i)){                    flag = true;                    break;                }            }            Hash[sum].push_back(i);        }        printf("%s\n", flag ? "Twin snowflakes found." : "No two snowflakes are alike.");    }    return 0;}
0 0
原创粉丝点击