题意:有n个数值,算出相邻两个值的差值,此时有n-1个值的序列,把这序列当做字符串的话,求最长重复子串,且这两个子串不能重叠。

分析:后缀数组解决。先二分答案,把题目变成判定性问题:判断是否存在两个长度为k 的子串是相同的,且不重叠。

只能说后缀数组很强大

PS:刚好是男人八题之一..........8分之1男人了.......

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. #define N 22222
  7. #define INF 0x7FFFFFFF
  8. /****后缀数组模版****/
  9. #define F(x)((x)/3+((x)%3==1?0:tb)) //F(x)求出原字符串的suffix(x)在新的字符串中的起始位置
  10. #define G(x)((x)<tb?(x)*3+1:((x)-tb)*3+2) //G(x)是计算新字符串的suffix(x)在原字符串中的位置,和F(x)为互逆运算
  11. int wa[N],wb[N],wv[N],WS[N];
  12. int sa[N*3] ; //第i小的后缀,起始位置在源字符串的位置
  13. int rank1[N],height[N]; //rank 以i为起始位置的后缀在后缀排列中的名次
  14. int r[N*3]; //如果输入是字符串,承接字符串,用来计算
  15.  
  16. int c0(int *r,int a,int b) {
  17. return r[a]==r[b] && r[a+1]==r[b+1] && r[a+2]==r[b+2];
  18. }
  19. int c12(int k,int *r,int a,int b) {
  20. if(k==2)
  21. return r[a]<r[b] || ( r[a]==r[b] && c12(1,r,a+1,b+1) );
  22. else
  23. return r[a]<r[b] || ( r[a]==r[b] && wv[a+1]<wv[b+1] );
  24. }
  25. void sort(int *r,int *a,int *b,int n,int m) {
  26. int i;
  27. for(i=0; i<n; i++)
  28. wv[i]=r[a[i]];
  29. for(i=0; i<m; i++)
  30. WS[i]=0;
  31. for(i=0; i<n; i++)
  32. WS[wv[i]]++;
  33. for(i=1; i<m; i++)
  34. WS[i]+=WS[i-1];
  35. for(i=n-1; i>=0; i--)
  36. b[--WS[wv[i]]]=a[i];
  37. return;
  38. }
  39.  
  40. //注意点:为了方便下面的递归处理,r数组和sa数组的大小都要是3*n
  41. void dc3(int *r,int *sa,int n,int m) { //rn数组保存的是递归处理的新字符串,san数组是新字符串的sa
  42. int i , j , *rn = r+n , *san = sa+n , ta = 0 ,tb = (n+1)/3 , tbc = 0 , p;
  43. r[n] = r[n+1] = 0;
  44. for(i=0; i<n; i++) {
  45. if(i%3!=0)
  46. wa[tbc++]=i; //tbc表示起始位置模3为1或2的后缀个数
  47. }
  48. sort(r+2,wa,wb,tbc,m);
  49. sort(r+1,wb,wa,tbc,m);
  50. sort(r,wa,wb,tbc,m);
  51. for(p=1,rn[F(wb[0])]=0,i=1; i<tbc; i++)
  52. rn[F(wb[i])]=c0(r,wb[i-1],wb[i])?p-1:p++;
  53. if(p<tbc)
  54. dc3(rn,san,tbc,p);
  55. else {
  56. for(i=0; i<tbc; i++)
  57. san[rn[i]]=i;
  58. }
  59. //对所有起始位置模3等于0的后缀排序
  60. for(i=0; i<tbc; i++) {
  61. if(san[i]<tb)
  62. wb[ta++]=san[i]*3;
  63. }
  64. if(n%3==1) //n%3==1,要特殊处理suffix(n-1)
  65. wb[ta++]=n-1;
  66. sort(r,wb,wa,ta,m);
  67. for(i=0; i<tbc; i++)
  68. wv[wb[i] = G(san[i])]=i;
  69. //合并所有后缀的排序结果,保存在sa数组中
  70. for(i=0,j=0,p=0; i<ta&&j<tbc; p++)
  71. sa[p]=c12(wb[j]%3,r,wa[i],wb[j])?wa[i++]:wb[j++];
  72. for(; i<ta; p++)
  73. sa[p]=wa[i++];
  74. for(; j<tbc; p++)
  75. sa[p]=wb[j++];
  76. return;
  77. }
  78.  
  79. //height[i]=suffix(sa[i-1])和suffix(sa[i])的最长公共前缀,也就是排名相邻的两个后缀的最长公共前缀
  80. void calheight(int *r,int *sa,int n) {
  81. int i,j,k=0;
  82. for(i=1; i<=n; i++)
  83. rank1[sa[i]]=i;
  84. for(i=0; i<n; height[rank1[i++]]=k)
  85. for(k?k--:0,j=sa[rank1[i]-1]; r[i+k]==r[j+k]; k++);
  86. }
  87. bool judge(int k,int n) {
  88. int maxx = 0,minn = INF;
  89. for(int i=2; i<=n; i++) {
  90. if(height[i] < k) {
  91. maxx = 0;
  92. minn = INF;
  93. } else {
  94. maxx = max(sa[i],max(maxx,sa[i-1]));
  95. minn = min(sa[i],min(minn,sa[i-1]));
  96. }
  97. if(maxx - minn >= k) return true;
  98. }
  99. return false;
  100. }
  101.  
  102. int main() {
  103. int n,t,tt;
  104. while(scanf("%d",&n) && n) {
  105. scanf("%d",&tt);
  106. -- n;
  107. for(int i=0; i<n; i++) {
  108. scanf("%d",&t);
  109. r[i] = t - tt + 100; //避免负数的情况
  110. tt = t;
  111. }
  112. r[n] = 0;
  113. dc3(r,sa,n+1,190);
  114. calheight(r,sa,n);
  115. //for(int i=0; i<=n; i++) cout << i << ' ' << height[i] << endl;
  116. int l=1, r=n,mid;
  117. int ans = 0;
  118. while(l<=r) {
  119. mid = (l+r) >> 1;
  120. if(judge(mid,n)) {
  121. ans = mid;
  122. l = mid + 1;
  123. } else {
  124. r = mid - 1;
  125. }
  126. }
  127. ans ++;
  128. if(ans >= 5) cout << ans << endl;
  129. else cout << 0 << endl;
  130. }
  131. return 0;
  132. }

POJ 1743 Musical Theme(后缀数组)的更多相关文章

  1. Poj 1743 Musical Theme (后缀数组+二分)

    题目链接: Poj  1743 Musical Theme 题目描述: 给出一串数字(数字区间在[1,88]),要在这串数字中找出一个主题,满足: 1:主题长度大于等于5. 2:主题在文本串中重复出现 ...

  2. POJ 1743 Musical Theme 后缀数组 最长重复不相交子串

    Musical ThemeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=1743 Description ...

  3. poj 1743 Musical Theme (后缀数组+二分法)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16162   Accepted: 5577 De ...

  4. Poj 1743 Musical Theme(后缀数组+二分答案)

    Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...

  5. [poj 1743] Musical Theme 后缀数组 or hash

    Musical Theme 题意 给出n个1-88组成的音符,让找出一个最长的连续子序列,满足以下条件: 长度大于5 不重叠的出现两次(这里的出现可以经过变调,即这个序列的每个数字全都加上一个整数x) ...

  6. POJ 1743 Musical Theme ——后缀数组

    [题目分析] 其实找最长的不重叠字串是很容易的,后缀数组+二分可以在nlogn的时间内解决. 但是转调是个棘手的事情. 其实只需要o(* ̄▽ ̄*)ブ差分就可以了. 背板题. [代码] #include ...

  7. POJ 1743 Musical Theme ( 后缀数组 && 最长不重叠相似子串 )

    题意 : 给 n 个数组成的串,求是否有多个“相似”且不重叠的子串的长度大于等于5,两个子串相似当且仅当长度相等且每一位的数字差都相等. 分析 :  根据题目对于 “ 相似 ” 串的定义,我们可以将原 ...

  8. POJ.1743.Musical Theme(后缀数组 倍增 二分 / 后缀自动机)

    题目链接 \(Description\) 给定一段数字序列(Ai∈[1,88]),求最长的两个子序列满足: 1.长度至少为5 2.一个子序列可以通过全部加或减同一个数来变成另一个子序列 3.两个子序列 ...

  9. POJ 1743 Musical Theme 后缀数组 不可重叠最长反复子串

    二分长度k 长度大于等于k的分成一组 每组sa最大的和最小的距离大于k 说明可行 #include <cstdio> #include <cstring> #include & ...

  10. poj 1743 Musical Theme 后缀自动机/后缀数组/后缀树

    题目大意 直接用了hzwer的题意 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题."主题&qu ...

随机推荐

  1. Vue2.0 vue-source.js jsonp demo vue跨域请求

    以调用百度的输入提示接口为例 ===================================================================================== ...

  2. 05.Hibernate多对多关联

        前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系     本文根据学生信息表(tb_student)和教师信息表(tb_teac ...

  3. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  4. .NET设计模式(15):结构型模式专题总结(转)

    摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能(对象结构型模式).这些结构型模式,它们在某些方面具有很大的相似 ...

  5. kerberos+ladp+hadoop-ha 安全认证部署配置

    随着hadoop集群里的数据量越来越大,各业务数据都集中了里面,自然要为各业务都要提供数据支持,又希望各业务数据是相对独立安全的,这最时候就需要做安全认证了 hadoop ha 测试集群部署规划 ha ...

  6. unity资源(移动版)提取 一点尝试

    原地址:http://blog.csdn.net/delguoqing/article/details/22619711 最近在参与一款手游,需要制定美术制作规范.因为拿不准主意,所以决定参考其他游戏 ...

  7. 流程控制语句和增强for循环

    import java.lang.Math; //import java.util.Arrays; public class test{ public static void main(String[ ...

  8. ASP.NET Session的七点认识

    原文:http://kb.cnblogs.com/page/108689/ ASP.NET Session的使用当中我们会遇到很多的问题,那么这里我们来谈下经常出现的一些常用ASP.NET Sessi ...

  9. javascript和“主流大型语言”(c# JAVA C++等)的差异

    1.javascript不支持overload,因为它的函数参数是以数组方式来实现的,没有固定的参数签名,所以无法重载. 2.javascript的基本类型只有5个:number string boo ...

  10. uva12534 Binary Matrix 2(最小费用最大流)

    http://blog.csdn.net/qq564690377/article/details/17082055 做的时候觉得明显是费用流,但是真的不知道怎么建图,看了上面的博客会稍微清晰一点.后面 ...