标签:arm ring ase lock struct insert -- mem counter
1 2 1 2 3 4 5 6 4 3 2 1 6 5
Twin snowflakes found.
注意hash表大小
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<sstream> #include<algorithm> #include<queue> #include<deque> #include<iomanip> #include<vector> #include<cmath> #include<map> #include<stack> #include<set> #include<fstream> #include<memory> #include<list> #include<string> using namespace std; typedef long long LL; typedef unsigned long long ULL; #define MAXN 100001 #define INF 1000000009 #define eps 0.00000001 /* 寻找是否有两片相同的雪花 雪花的边可能从任意一边 开始! Hash 雪花总边长 */ typedef struct Hashnode { int a[6]; struct Hashnode* next; }*List; typedef struct HashT { List* L; }*HashTable; int NextPrime(int n) { int i; for (int tmp = n;; tmp++) { for (i = 2; i*i <= tmp; i++) { if (tmp%i == 0) break; } if (i*i > tmp) return i; } } HashTable Init(int n) { HashTable H = (HashTable)malloc(sizeof(HashT)); H->L = (List*)malloc(sizeof(List)*MAXN); for (int i = 0; i < MAXN; i++) { H->L[i] = (List)malloc(sizeof(Hashnode)); memset(H->L[i]->a, 0, sizeof(H->L[i]->a)); H->L[i]->next = NULL; } return H; } void Free(HashTable H) { for (int i = 0; i < MAXN; i++) free(H->L[i]); free(H->L); free(H); } int Hash(int sum, int h) { return sum%h; } List Find(int a[6], int sum, HashTable H) { List p = H->L[Hash(sum, MAXN)]; List l = p->next; int i; while (l != NULL) { for (int j = 0; j < 6; j++) { if (l->a[j] == a[0]) { for (i = 1; i < 6; i++) { if (l->a[(j + i) % 6] != a[i]) break; } if (i == 6) return l; for (i = 1; i < 6; i++) { if (l->a[(j - i + 6) % 6] != a[i]) break; } if (i == 6) return l; } } l = l->next; } return NULL; } bool Insert(int a[6], int sum, HashTable H) { List L = H->L[Hash(sum, MAXN)]; List p = Find(a, sum, H); if (p == NULL) { List tmp = (List)malloc(sizeof(Hashnode)); for (int i = 0; i < 6; i++) tmp->a[i] = a[i]; tmp->next = L->next; L->next = tmp; return true; } return false; } int main() { int T, n, tmp[6]; bool f; scanf("%d", &T); while (T--) { scanf("%d", &n); f = false; HashTable H = Init(n); for (int i = 0; i < n; i++) { int sum = 0; for (int j = 0; j < 6; j++) { scanf("%d", &tmp[j]); sum += tmp[j]; } if (!f && !Insert(tmp, sum, H)) f = true; } if (f) printf("Twin snowflakes found.\n"); else printf("No two snowflakes are alike.\n"); Free(H); } return 0; }
标签:arm ring ase lock struct insert -- mem counter
原文地址:http://www.cnblogs.com/joeylee97/p/6882328.html