加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

CSU 1581Clock Pictures Hash

发布时间:2020-12-13 20:10:11 所属栏目:PHP教程 来源:网络整理
导读:题目链接:点击打开链接 题意: 给出闹钟的n个指针当前所指的角度 求2个闹钟通过旋转后能否相同 思路: 先排个序保证偏序的关系,然后坐差, 枚举第2个串的哪1位和第1个串的第1字符匹配,然后hash判断 #include iostream#include cstdio#include cstring#inc

题目链接:点击打开链接

题意:

给出闹钟的n个指针当前所指的角度

求2个闹钟通过旋转后能否相同

思路:

先排个序保证偏序的关系,然后坐差,

枚举第2个串的哪1位和第1个串的第1字符匹配,然后hash判断

#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <algorithm> template <class T> inline bool rd(T &ret) { char c; int sgn; if (c = getchar(),c == EOF) return 0; while (c != '-' && (c<'0' || c>'9')) c = getchar(); sgn = (c == '-') ? ⑴ : 1; ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(),c >= '0'&&c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return 1; } template <class T> inline void pt(T x) { if (x <0) { putchar('-'); x = -x; } if (x>9) pt(x / 10); putchar(x % 10 + '0'); } using namespace std; const int N = 200105; typedef long long ll; const int MAGIC = 311,MOD = 1e9 + 7; template <class T> struct HASH{ ll h[N],base[N]; inline void init(T *s,int len) { h[0] = 1; for (int i = 1; i <= len; ++i) h[i] = (h[i - 1] * MAGIC % MOD + s[i - 1]) % MOD; base[0] = 1; for (int i = 1; i <= len; ++i) base[i] = (base[i - 1] * MAGIC) % MOD; } inline long long get(int l,int r) { return (h[r] - h[l - 1] * base[r - l + 1] % MOD + MOD) % MOD; } }; HASH <int>A,B; int a[N],b[N],n; ll x[N],y[N]; int main(){ while (~scanf("%d",&n)){ for (int i = 0; i < n; i++)rd(a[i]); for (int i = 0; i < n; i++)rd(b[i]); sort(a,a + n); sort(b,b + n); a[n] = a[0]; b[n] = b[0]; for (int i = 0; i < n; i++){ a[i] = a[i + 1] - a[i]; if (a[i] < 0) a[i] += 360000; b[i] = b[i + 1] - b[i]; if (b[i] < 0) b[i] += 360000; } // for(int i = 0;i < n; i++)cout<<a[i]<<" "; puts(""); // for(int i = 0;i < n; i++)cout<<b[i]<<" "; puts(""); A.init(a,n); B.init(b,n); bool ok = A.get(1,n) == B.get(1,n); for (int i = 2; i <= n && ok == false; i++){ int len = n - i; // printf("(%d,%d)-(%d,%d) ",1,len+1,i,n); // printf("(%d,len+2,n,i⑴); if (A.get(1,len + 1) == B.get(i,n) && A.get(len + 2,i - 1)) ok = true; } if (ok)puts("possible"); else puts("impossible"); } return 0; }


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读