poj3349-Snowflake Snow Snowflakes,字符串哈希

来源:互联网 发布:我的淘宝怎么不能直播 编辑:程序博客网 时间:2024/05/17 22:45

点击打开链接


#include <stdio.h>#include <string.h>#include <stdlib.h>const int N = 100005;const int M = 10;const int mod = 100003;int head[N], num, a[M], snow[N][M];struct node{    int pos, next;}e[N];void hash(int val, int pos){    e[num].pos = pos;    e[num].next = head[val];    head[val] = num++;}int check(int a, int b){    int i, j;    for(i=0; i<6; ++i)    {        j=0;        while(j<6&&snow[a][(i+j)%6]==snow[b][j])            j++;        if(j==6)            return 1;        j=0;        while(j<6&&snow[a][5-(i+j)%6]==snow[b][j])            j++;        if(j==6)            return 1;    }    return 0;}int readint(){    int res=0,ch;    while(!((ch=getchar())>='0'&&ch<='9'))    {       if(ch==EOF)  return 1<<30;    }    res=ch-'0';    while((ch=getchar())>='0'&&ch<='9')        res=res*10+(ch-'0');    return res ;}int find(int n){    int i, j, val, pos;    val = ((snow[n][0]+snow[n][2]+snow[n][4])^(snow[n][1]+snow[n][3]+snow[n][5]) )% mod;    for(i=head[val]; ~i; i=e[i].next)    {        pos =e[i].pos;        if(check(n, pos))            return 1;    }    hash(val, n);    return 0;}int main(){    int i, j, n, val, pos, flag;    while(~scanf("%d", &n))    {        flag = 0;        num = 0;        memset(head, -1, sizeof head );        for(i=1; i<=n; ++i)        {            for(j=0; j<6; ++j)                snow[i][j] = readint();            if(flag)                continue;            if(find(i))                flag = 1;        }        if(flag)            printf("Twin snowflakes found.\n");        else            printf("No two snowflakes are alike.\n");    }    return 0;}


0 0
原创粉丝点击