[POJ 1743] Musical Theme (字符串哈希+二分)
来源:互联网 发布:淘宝模特拍摄布光 编辑:程序博客网 时间:2024/05/29 19:32
链接
POJ 1743
题意
给出一个序列,元素范围1到88,求出最长连续子序列长度,满足该序列(或该序列的逆序)在序列中出现过至少2次并且不相交(没有公共部分)。
思路
又是子串+长度问题,可用哈希+二分解决。
把序列看做字符串,字符集是1到88,对字符串正序逆序求哈希,二分长度len,从左向右枚举长度为len的子串。这时候需要对正序的子串和相同位置的逆序子串同时枚举。枚举后判断是否出现过且不相交,没出现过的话就存储该子串的哈希值到哈希表内,出现过则不重复存储,只记录最左侧的位置即可。
代码
#include <cstdio>#include <cstring>#include <iostream>using namespace std;typedef unsigned long long ulint;const ulint seed = 30007uLL;//const ulint mod = 1e9 + 1107uLL;#define maxn 20020ulint H[maxn], xp[maxn];int s[maxn], N;void initHash(){ H[0] = s[0]; for(int i = 1; i < N; i++) H[i] = H[i - 1]*seed + s[i];}ulint askHash(int l, int r){ if(l == 0) return H[r]; return H[r] - H[l - 1]*xp[r - l + 1];}#define mod 100003ulint h[mod];int bg[mod], nx[mod], pos[mod];bool check(int len){ memset(bg, 0, sizeof(bg)); ulint ht; int e = 0; for(int i = 0, l, r; i + len - 1 < N; i++) { l = i, r = i + len - 1; ht = askHash(l, r); for(int p = bg[ht % mod]; p; p = nx[p]) if(h[p] == ht && i - pos[p] >= len) return true; h[++e] = ht; nx[e] = bg[ht % mod]; bg[ht % mod] = e; pos[e] = i; } return false;}int main(){ //freopen("1743.txt", "r", stdin); xp[0] = 1; for(int i = 1; i < maxn; i++) { xp[i] = xp[i-1] * seed; } while(scanf("%d", &N) && N) { for(int i = 0; i < N; i++) { scanf("%d", &s[i]); } N--; for(int i = 0; i < N; i++) { s[i] = 89 + s[i+1] - s[i]; } initHash(); int ans = 0, l = 1, r = N / 2, m; while(l <= r) { m = (l + r) >> 1; if(check(m)) { l = m + 1; ans = m; } else r = m - 1; } cout << ((ans >= 4)? ans+1: 0) << endl; } return 0;}
0 0
- [POJ 1743] Musical Theme (字符串哈希+二分)
- poj 1743 Musical Theme(后缀数组+二分)
- POJ 1743 Musical Theme(二分+后缀数组)
- POJ-1743-Musical Theme(后缀数组+二分)
- POJ 1743 Musical Theme(后缀数组+二分)
- POJ 1743 Musical Theme (后缀数组 + 二分)
- poj 1743 Musical Theme (二分+后缀数组)
- [后缀数组+二分] poj 1743 Musical Theme
- POJ 1743 Musical Theme Hash+二分
- POJ 1743 Musical Theme 后缀数组+二分
- poj 1743 Musical Theme(后缀数组、二分)
- POJ-1743 Musical Theme,后缀数组+二分!
- POJ 1743 Musical Theme <后缀数组+二分>
- POJ 1743 Musical Theme 后缀数组 二分
- POJ 1743 Musical Theme 后缀数组+二分
- POJ 1743 Musical Theme(二分+后缀数组)
- poj 1743 Musical Theme
- poj 1743 Musical Theme
- Python 爬虫 + MongoDB
- 51nod 1185 威佐夫游戏 V2(威佐夫博弈)
- 96. Unique Binary Search Trees
- C++ sql的配置与基本连接
- 迁移学习和微调深度卷积神经网络
- [POJ 1743] Musical Theme (字符串哈希+二分)
- Hdu 4918 Query on the subtree(一棵树,两种操作,一种是将某个点的权值修改为v,另一种是查询距离点u不超过d的点的权值和。)
- usaco cowtour
- HDU 5718 Oracle【大数相加】
- Intellij idea run/debug 找不到配置文件
- proc文件系统
- Swing之JList的使用
- POJ 2831 Prim
- xx并发压测xx系统注册、查询、绑定邮箱等业务,数据库连接报异常及解决方法