字符串专题:POJ3261——字符串哈希
来源:互联网 发布:2017年java工程师工资 编辑:程序博客网 时间:2024/05/16 11:39
题目描述:
给出一个数列,求出数列中最长连续子序列,并且满足该子序列在数列中出现超过k次。
大致思路:
最开始想的是用字典树,以数列中每一个元素a[i]为开头到末尾的序列都放到Trie中,然后在插入过程中,访问到一个结点就把结点权值+1,这样只要在树中找到权值全部大于K的连续结点个数……但是数据范围0-1000000,Trie根本应付不了……
于是想后缀数组能不能搞呢?显然是可以的,先构造出一个后缀数组,然后二分答案就可以了。
不过后缀数组写起来很复杂,而且数列长度只有20000,所以就想到了用字符串哈希来搞。首先长度L是需要二分搜索的,然后对于每一种L判断一下长度为L的字符串出现了至少K次。判断方法很简单,枚举每一个长度L的子串,求出hash值之后,丢到multiset里边……每次用一下lower_bound和upper_bound就可以求出该hash值在序列中出现了多少次……但是对于只有20000的数据来说nlogn有点奢侈……n(logn)^2的复杂度就完全没有问题了。所以计算所有L长度子串哈希值之后,排序一下,之后遍历一遍数组,求出出现次数的最大值就OK了……
代码:
这样看的话代码量比后缀数组少了不是一星半点……时间也没差多少。
#include <cstdio>#include <cstring>#include <algorithm> using namespace std; typedef unsigned long long ll; const int maxn = 20000 + 10;const int x = 131;int m,pos;ll H[maxn],xp[maxn];ll hash[maxn];int rank[maxn];int s[maxn],n,k; int cmp(const int &a, const int &b){ returnhash[a] < hash[b] || (hash[a] == hash[b] && a < b);} int possible(int L) { intc = 0; pos= -1; for(int i = 0; i < n-L+1; i++) { rank[i]= i; hash[i]= H[i] - H[i+L]*xp[L]; } sort(rank,rank+n-L+1, cmp); for(int i = 0; i < n-L+1; i++) { if(i == 0 || hash[rank[i]] != hash[rank[i-1]]) c = 0; if(++c >= k) pos = max(pos, rank[i]); } returnpos >= 0;} int main() { scanf("%d%d",&n,&k); for(int i = 0; i < n; i++) { scanf("%d",s+i); } H[n]= 0; for(int i = n-1; i >= 0; i--) H[i] = H[i+1]*x + s[i]; xp[0]= 1; for(int i = 1; i <= n; i++) xp[i] = xp[i-1]*x; intL = 1, R = n+1; while(R - L > 1) { intM = L + (R-L)/2; if(possible(M)) L = M; else R = M; } possible(L); printf("%d\n",L);}
0 0
- 字符串专题:POJ3261——字符串哈希
- 【POJ3261】字符串哈希
- 字符串专题
- 字符串专题
- 字符串专题
- 字符串专题
- 专题:字符串
- 字符串专题
- 字符串专题
- 字符串专题:HDU2222——多串匹配
- PHP 截取字符串专题
- PHP 截取字符串专题
- PHP 截取字符串专题
- PHP 截取字符串专题
- PHP 截取字符串专题
- 面试题目 字符串专题
- PHP 截取字符串专题
- js字符串处理专题
- cmake介绍和使用cmake实践
- JavaWeb--Tomcat
- Nosql Mongodb之旅(7)—MongoDB界面操作
- 多进程竞争资源----哲学家就餐问题
- 面试绝对不能说的12件事
- 字符串专题:POJ3261——字符串哈希
- iis服务器 sqlserver数据库命令行启动关闭
- wxWidgets笔记_1_linux环境下wxwidgets的安装与配置
- 去掉xcode中警告的一些经验
- Nosql Mongodb之旅(8)—MongoDB高级查询の游标使用
- 神秘的包装2
- 黑马程序员—JAVA面向对象
- wifi共享精灵轻松实现Dote局域网对战
- 后台拼json传到前台接收(非ajax)