POJ

来源:互联网 发布:网络交友英语作文题目 编辑:程序博客网 时间:2024/06/05 09:24

POJ - 3349 Snowflake Snow Snowflakes 题目


题意:求一堆雪花,有没有两片相同,给你的序列可能是顺时针,也可能是逆时针。

思路 : 真的才发现我stl学的简直烂到爆炸,现在都不知道之前c++的CE从何而来。

这题直接上map会超时,所以我们要考虑一种更快的查找,那么就是hash啦~

不过说起来,我的hash的散列函数也不是特别高效。

代码:

#include <cstdio>#include <cstring>#include <iostream>#include <set>#include <vector>#include <algorithm>using namespace std;#define ll long longconst int maxn = 9973;const int inf = 0x3f3f3f3f;struct node{    int a[6];    node(){}    node(int t[6])    {   for(int i = 0; i < 6; i++) a[i] = t[i]; }}has[maxn][1005];int hlen[maxn];int d[6];int fhas(){    ll ans = 0;    for(int i = 0; i < 6; i++)       ans += d[i];    return ans%maxn;}int com(int a[6]){    int flag = 0;    for(int i = 0; i < 6; i++)    {        int mark = 0;        for(int j = 0; j < 6; j++)        {            if(d[(i+j)%6] != a[j])            {mark = 1; break;}        }        if(mark == 0) flag = 1;    }    if(flag) return 1;    for(int i = 0; i < 6; i++)    {        int mark = 0;        for(int j = 0; j < 6; j++)        {            if(d[(i+j)%6] != a[5-j])            {mark = 1; break;}        }        if(!mark) flag = 1;    }    return flag;}int main(){    int n;    scanf("%d",&n);    int flag = 0;    for(int i = 0; i < n; i++)    {        for(int j = 0; j < 6; j++)            scanf("%d",&d[j]);        if(flag) continue;        int id1 = fhas();        for(int j = 0; j < hlen[id1]; j++)        {            int mark = 0;            if(com(has[id1][j].a) == 0) mark = 1;            if(!mark) flag = 1;        }        if(!flag)            has[id1][ hlen[id1] ] = node(d), hlen[id1] ++;    }    flag? printf("Twin snowflakes found.\n"):printf("No two snowflakes are alike.\n");    return 0;}