Hrbust 2300 下雪啦【字符串Hash】

来源:互联网 发布:凤凰金融 以大数据为 编辑:程序博客网 时间:2024/05/16 11:20

下雪啦Time Limit: 2500 MSMemory Limit: 32768 KTotal Submit: 276(51 users)Total Accepted: 58(26 users)Rating: Special Judge: NoDescription

陈月亮最喜欢的季节就是冬天了,这不看着窗外飘起了雪花,陈月亮开心的跑出屋来看雪。但是迷迷糊糊的陈月亮不知道自己是在做梦还是真的下起了雪。突然她想起了一句话,在真实世界中是没有两片一样的雪花的。于是你的任务就是比较这场雪中的所有雪花,如果出现了两朵完全一致的雪花,则证明陈月亮是在梦中。

每朵雪花用六个整数表示,范围在(1 – 10000000)之间,表示雪花六个花瓣的长度,六个整数的先后出现顺序可能是顺时针顺序也可能是逆时针顺序,并且可能是从任意一个花瓣开始的。比如说对同一个花瓣,描述方法可能是1 2 3 4 5 6 或者 4 3 2 1 6 5

Input

第一行为一个整数T,表示有T组测试数据。

每组测试数据第一行为一个整数N(0 < N <= 100000),表示雪花的数目。

接下来n行每行六个整数,描述一朵雪花。

Output

如果没有相同的雪花,输出“No two snowflakes are alike.”,否则输出“Twin snowflakes found.”

Sample Input

1

2

1 2 3 4 5 6

4 3 2 1 6 5


Sample Output

Twin snowflakes found.

Source2016级新生程序设计全国邀请赛

思路:


暴力字符串哈希即可。


值得注意的点是我们得到了每个字符串的哈希值之后,直接用map映射存的话会MLE(破OJ),需要再开一个Hash来存每个字符串的哈希值。


Ac代码:

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<map>using namespace std;#define ll long long intunsigned long long int h[10];unsigned long long int Getval(int s[],int n){    unsigned long long int x=1;    for(int i=0;i<n;i++)    {        h[i]=h[i-1]+x*s[i];        x=x*19260817;    }    return h[n-1];}const unsigned long long int maxn=450000;const unsigned long long int hashh=1000007;struct hashmap{    unsigned long long int a[maxn];    int head[hashh];    int next[maxn];    int size;    void init()    {        memset(head,-1,sizeof(head));        size=0;    }    bool find(unsigned long long int val)    {        int tmp=(val%hashh+hashh)%hashh;        for(int i=head[tmp];i!=-1;i=next[i])        {            if(val==a[i])return true;        }        return false;    }    void add(unsigned long long int val)    {        int tmp=(val%hashh+hashh)%hashh;        if(find(val))return ;        a[size]=val;        next[size]=head[tmp];//令next指向-1、        head[tmp]=size++;    }}H;int main(){    int t;    scanf("%d",&t);    while(t--)    {        H.init();        int flag=0;        int n;        scanf("%d",&n);        int a[10];        for(int i=0;i<n;i++)        {            for(int j=0;j<6;j++)            {                scanf("%d",&a[j]);            }            unsigned long long int sum=Getval(a,6);            for(int z=0;z<6;z++)            {                int temp=a[0];                for(int j=0;j<6;j++)                {                    if(j<5)                    a[j]=a[j+1];                    else a[j]=temp;                }                unsigned long long int summ=Getval(a,6);                if(H.find(summ)>0)flag=1;            }            reverse(a,a+6);            for(int z=0;z<6;z++)            {                int temp=a[0];                for(int j=0;j<6;j++)                {                    if(j<5)                    a[j]=a[j+1];                    else a[j]=temp;                }                unsigned long long int summ=Getval(a,6);               if(H.find(summ)>0)flag=1;            }            H.add(sum);        }        if(flag==1)printf("Twin snowflakes found.\n");        else printf("No two snowflakes are alike.\n");    }}