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;}
阅读全文
0 0
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- 使用yeoman搭建react-webpack框架的学习
- 算法设计与应用基础系列12
- Sublime Text 3常用插件安装
- centos 下 安装使用GoogleMock
- GitHub-fork/star/watch/follow
- POJ
- input、textarea标签placeholder兼容IE8浏览器js插件代码
- 控制台程序求解有理式(带括号,带小数)
- C++网站开发MVC框架TreeFrog Framework教程——8.Otama模板
- Windows 7(Win7)下Visual Studio 2012(VS2012)编译jrtplib与MinGW编译jrtplib
- Java 静态工厂模式的使用
- Eclipse Memory Analysis的安装和使用
- name,id,class的关系和区别
- 九大Java性能调试工具,必备至少一款