Codeforces Gym 100203D Different vectors 想法题 + Hash
来源:互联网 发布:软件操作手册 编辑:程序博客网 时间:2024/05/31 20:52
题目大意:
就是现在给出N个向量, 对于两个向量他们相等的条件是可以通过轮转使得存在正整数之间的双射使得两者相等
给出N个向量问不相等的向量有多少个
大致思路:
首先对于每个向量, 先求出对于每个位置向左边(或者向右边)最近的和它相同的位置到这个位置的距离作为这个位置的新值
例如 1 2 2 3向左找的话就是 4 3 1 4, 只要两个向量这么变化之后通过轮转是一样的话就一定恩那个通过双射得到, 判断两个字符串相等的话, Hash就够了, 可以O(1)推出轮转之后的hash值
代码如下:
Result : Accepted Memory : 9176 KB Time : 374 ms
/* * Author: Gatevin * Created Time: 2015/8/15 19:03:34 * File Name: Sakura_Chiyo.cpp */#include<iostream>#include<sstream>#include<fstream>#include<vector>#include<list>#include<deque>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>#include<cctype>#include<cmath>#include<ctime>#include<iomanip>using namespace std;const double eps(1e-8);typedef long long lint;typedef unsigned long long ulint;const ulint seed = 23333uLL;int T, N, K;int a[10010][110];set<ulint> H;ulint xp[10010];ulint hash(int p){ ulint value = a[p][0]; for(int i = 1; i < K; i++) value = value*seed + a[p][i]; return value;}void insert(int p, ulint value){ H.insert(value); for(int i = 0; i < K; i++) { value = (value - a[p][i]*xp[K - 1])*seed + a[p][i]; H.insert(value); } return;}int b[110];int main(){ xp[0] = 1uLL; for(int i = 1; i < 10010; i++) xp[i] = xp[i - 1]*seed; scanf("%d", &T); while(T--) { H.clear(); scanf("%d %d", &N, &K); for(int i = 0; i < N; i++) { for(int j = 0; j < K; j++) scanf("%d", &a[i][j]); for(int j = 0; j < K; j++) { b[j] = 1; while(a[i][j] != a[i][(j + b[j]) % K]) b[j]++; } for(int j = 0; j < K; j++) a[i][j] = b[j]; } int ans = 0; for(int i = 0; i < N; i++) { ulint val = hash(i); if(H.find(val) != H.end()) continue; insert(i, val); ans++; } printf("%d\n", ans); } return 0;}
1 0
- Codeforces Gym 100203D Different vectors 想法题 + Hash
- Codeforces Gym 100203D Different vectors 最小表示法
- CodeForces GYM 101158D Hidden Anagrams hash+unordered_set
- CodeForces 322D 想法题
- Codeforces gym 101350F 想法
- Codeforces gym 101149 G 想法
- Codeforces gym 101149 K 想法
- Codeforces gym 101102 K 想法
- CodeForces Gym 100735D
- CodeForces 128D Numbers [想法题/贪心]
- Codeforces 733D 立方体(想法题)
- Codeforces 359D 想法
- Codeforces 496D 想法
- codeforces GYM 101431D(构造)
- Codeforces Gym 101485D Debugging
- Gym 101128H想法题
- Gym 101128C想法题
- Codeforces Gym 100623D Problem D. Deposits
- java判断今天,昨天,前天,不能用秒间隔
- B. Jzzhu and Sequences
- PAT《数据结构学习与实验指导》实验项目集 3-04
- QTP/UFT 11.5 特性和安装的配置要求
- 计算机网络面试常考知识点
- Codeforces Gym 100203D Different vectors 想法题 + Hash
- 游标与事务结合使用,在游标内启用事务;判断数据类型不符合时执行下一条
- 解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
- hdu 1588 Gauss Fibonacci(矩阵乘法)
- UITableView的封装和类的交互2
- 去哪网实习总结:怎样配置数据库连接(JavaWeb)
- 继承和多态
- GYM 100285 E. The Emperor’s plan(组合数学+dp)
- 黑马程序员----泛型(Generic)