POJ-1743 Musical Theme 字符串问题 不重叠最长重复子串
题目链接:https://cn.vjudge.net/problem/POJ-1743
题意
给一串整数,问最长不可重叠最长重复子串有多长
注意这里匹配的意思是匹配串的所有元素可以减去或者加上某个值
例: 34 30 26 22 18 82 78 74 70 66
后5个整数的串可以匹配前5个数
思路
LCP问题(最长公共前缀)
两个思路
- 后缀数组
对height数组二分长度,找到height大于len且两字符串起点差值大于len的情况下,len最大值 - 哈希+二分
二分长度,哈希值比较字符串找到当前len下符合要求子串即可
这题我用的第二个思路
首先差分一下,然后二分长度,用哈希的方法比较两个字符串O(1)
总复杂度O(nlog)(初始化O(n)+二分O(1nlogn))
刚从蓝书看来的,然而本题对hash表要求很高(能够处理unsigned long long大小键值)
那个简洁的HashMap还是要改改
具体写下好了
首先构建一个H数组,具体的
\]
对一个以i为起点,len为长度的字符串,他的Hash值:
\]
然后O(n)的字符串比较复杂度降到O(1)
这里可能会撞hash,所以保险一点咱还得再直接判断是否相同
提交过程
| WA*n | |
| TLE*n | |
| AC |
代码
#include <cstdio>
#include <cstring>
const int maxn=2e4+20;
const int HASH = 10007;
const int MAXN = 20010;
const unsigned long long hashBase=13331;
struct HASHMAP{
int head[HASH],next[MAXN],size;
unsigned long long state[MAXN];
int f[MAXN];
void init(){
size = 0;
memset(head,-1,sizeof(head));
}
int insert(unsigned long long val,int _id){
int h = val%HASH;
for(int i = head[h]; i != -1;i = next[i])
if(val == state[i]) return f[i];
f[size] = _id;
state[size] = val;
next[size] = head[h];
head[h] = size++;
return f[size-1];
}
}hash;
unsigned long long hashBasePow[maxn], H[maxn];
int str[maxn], n;
bool judge(int len){
hash.init();// hash.clear();
for(int i=0; i<n-len; i++){
unsigned long long key=H[i]-H[i+len]*hashBasePow[len];
if (hash.insert(key, i)<i-len) return true;
}return false;
}
int solve(void){
int ans=0;
int l=4, r=n-1;
while(l<=r){
int mid=l+(r-l)/2;
if(judge(mid)) ans=mid, l=mid+1;
else r=mid-1;
}
if(ans<4) ans=-1;
return ans+1;
}
int main(){
hashBasePow[0]=1;
for(int i=1; i<maxn; i++)
hashBasePow[i]=hashBasePow[i-1]*hashBase;
while(scanf("%d", &n)==1 && n){
for (int i=0; i<n; i++) scanf("%d", &str[i]);
for (int i=0; i<n-1; i++) str[i]-=str[i+1];
H[n-1]=str[n-1];
for (int i=n-2; i>=0; i--)
H[i]=H[i+1]*hashBase+str[i];
printf("%d\n", solve());
}
return 0;
}
| Time | Memory | Length | Lang | Submitted |
|---|---|---|---|---|
| 547ms | 1080kB | 1557 | G++ | 2018-08-03 15:26:17 |
POJ-1743 Musical Theme 字符串问题 不重叠最长重复子串的更多相关文章
- POJ 1743 Musical Theme 后缀数组 不可重叠最长反复子串
二分长度k 长度大于等于k的分成一组 每组sa最大的和最小的距离大于k 说明可行 #include <cstdio> #include <cstring> #include & ...
- [Poj1743] [后缀数组论文例题] Musical Theme [后缀数组不可重叠最长重复子串]
利用后缀数组,先对读入整数处理str[i]=str[i+1]-str[i]+90这样可以避免负数,计算Height数组,二分答案,如果某处H<lim则将H数组分开,最终分成若干块,判断每块中是否 ...
- POJ 1743 Musical Theme (后缀数组,求最长不重叠重复子串)(转)
永恒的大牛,kuangbin,膜拜一下,Orz 链接:http://www.cnblogs.com/kuangbin/archive/2013/04/23/3039313.html Musical T ...
- POJ 1743 Musical Theme(不可重叠最长重复子串)
题目链接:http://poj.org/problem?id=1743 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一 ...
- poj 1743 Musical Theme(最长重复子串 后缀数组)
poj 1743 Musical Theme(最长重复子串 后缀数组) 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复 ...
- Poj 1743 Musical Theme (后缀数组+二分)
题目链接: Poj 1743 Musical Theme 题目描述: 给出一串数字(数字区间在[1,88]),要在这串数字中找出一个主题,满足: 1:主题长度大于等于5. 2:主题在文本串中重复出现 ...
- POJ - 1743 Musical Theme (后缀数组)
题目链接:POJ - 1743 (不可重叠最长子串) 题意:有N(1<=N<=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的子串,它需要 ...
- POJ 1743 Musical Theme(后缀数组)
题意:有n个数值,算出相邻两个值的差值,此时有n-1个值的序列,把这序列当做字符串的话,求最长重复子串,且这两个子串不能重叠. 分析:后缀数组解决.先二分答案,把题目变成判定性问题:判断是否存在两个长 ...
- poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14874 Accepted: 5118 De ...
随机推荐
- DHCPv6,IPv6的有状态自动配置
DHCPv6,IPv6的有状态自动配置 DHCPv6的工作原理与DHCPv4极其相似,但有一个明显的差别,那就是支持IPV6新增的编址方案.DHCP提供了一些自动配置没有的选项.在自动配置中,根本没有 ...
- 如何使用阿里云的yum源
这里需要有网.因为我们需要下载会用到wget [root@localhost ~]# iptables -F[root@localhost ~]# systemctl stop firewalld[r ...
- Pyhton学习——Day41
#一个完整的 JavaScript 实现是由以下 3 个不同部分组成的:# 核心(ECMAScript)# 文档对象模型(DOM) Document object model (整合js,css,ht ...
- [NOIP补坑计划]NOIP2017 题解&做题心得
终于做完了…… 场上预计得分:?(省一分数线:295) 由于看过部分题解所以没有预计得分qwq 题解: D1T1 小凯的疑惑 题面 震惊!一道小学奥数题竟难倒无数高中考生! 欢迎大家以各种姿势*和谐* ...
- CF1042F Leaf Sets (贪心+树上构造)
题目大意:给你一棵树,让你对叶节点分组,保证每组中,任意两个叶节点之间的距离不大于K,求最小的组数 手动yy的贪心竟然对的 对于每个节点,维护一个$ma[i]$,表示在$i$节点的子树内 未被分组的叶 ...
- [php]如何做到高并发优化
在实际的开发过程中我们遇到过各种各样的活动,但像用户流量较大的平台就需要考虑高并发的问题,但是如何去解决呢?我总结了几种解决方案,欢迎大家指正! 一.什么是PV/UV/QPS? PV:页面访问量,即P ...
- Python 绘图与可视化 matplotlib(下)
详细的参考链接:更详细的:https://www.cnblogs.com/zhizhan/p/5615947.html 图像.子图.坐标轴以及记号 Matplotlib中图像的意思是打开的整个画图窗口 ...
- 样本方差的无偏估计与(n-1)的由来
一.无偏估计 所谓总体参数估计量的无偏性指的是,基于不同的样本,使用该估计量可算出多个估计值,但它们的平均值等于被估参数的真值. 在某些场合下,无偏性的要求是有实际意义的.例如,假设在某厂商与某销售商 ...
- Linux下的进程环境
僵尸进程.孤儿进程.守护进程.进程组.会话.前台进程组.后台进程组 1,僵尸进程 子进程结束,父进程没有明确的答复操作系统内核:已收到子进程结束的消息.此时操作系统内核会一直保存该子进程的部分PCB信 ...
- 2015 Multi-University Training Contest 3 hdu 5318 The Goddess Of The Moon
The Goddess Of The Moon Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...