神题!!

2333,要求可以给区间加减同一个数,然后我就懵逼了,,%%题解,可以用差分嘛2333

所以原来的区间长度差分之后就要减一了,

然后现在用sa搞出height数组,然后对于>=len(len为二分的答案长度-1)的区间,去里面sa的最大和最小的差,就是这两个子串相距的最远距离了,判断这个是不是满足>len就好

注意,不能==len,因为这是差分数组,==len的话就相当于重合

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #define N 100005
 5 #define inf 0x3f3f3f3f
 6 #define LL long long
 7 #define eps 1e-8
 8 using namespace std;
 9 inline int ra()
10 {
11     int x=0,f=1; char ch=getchar();
12     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
13     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
14     return x*f;
15 }
16
17 int sa[2][N],rank[2][N],v[N],height[N];
18 int p=0,q=1,n;
19 int a[N];
20
21 void get_height()
22 {
23     int k=0;
24     for (int i=1; i<=n; i++)
25     {
26         if (rank[p][i]==1) height[1]=0;
27         else
28         {
29             int j=sa[p][rank[p][i]-1];
30             while (a[i+k]==a[j+k]) k++;
31             height[rank[p][i]]=k; k?k--:k;
32         }
33     }
34 }
35 void cal_sa(int sa[N], int rank[N], int Sa[N], int Rank[N], int k)
36 {
37     for (int i=1; i<=n; i++) v[rank[sa[i]]]=i;
38     for (int i=n; i>=1; i--) if (sa[i]>k) Sa[v[rank[sa[i]-k]]--]=sa[i]-k;
39     for (int i=n-k+1; i<=n; i++) Sa[v[rank[i]]--]=i;
40     for (int i=1; i<=n; i++) Rank[Sa[i]]=Rank[Sa[i-1]]+(rank[Sa[i]]!=rank[Sa[i-1]] || rank[Sa[i]+k]!=rank[Sa[i-1]+k]);
41 }
42 void work()
43 {
44     for (int i=1; i<=n; i++) v[a[i]]++;
45     for (int i=1; i<=200; i++) v[i]+=v[i-1];
46     for (int i=1; i<=n; i++) sa[p][v[a[i]]--]=i;
47     for (int i=1; i<=n; i++) rank[p][sa[p][i]]=rank[p][sa[p][i-1]]+(a[sa[p][i]]!=a[sa[p][i-1]]);
48     for (int k=1; k<n; k<<=1,swap(p,q)) cal_sa(sa[p],rank[p],sa[q],rank[q],k);
49     get_height();
50 }
51 bool check(int len)
52 {
53     int mn=inf,mx=-inf;
54     for (int i=2; i<=n; i++)
55     {
56         if (height[i]>=len)
57         {
58             mx=max(mx,max(sa[p][i-1],sa[p][i]));
59             mn=min(mn,min(sa[p][i-1],sa[p][i]));
60             if (mx-mn>len) return 1;
61         }
62         else mn=inf,mx=-inf;
63     }
64     return 0;
65 }
66 void solve()
67 {
68     int l=0,r=n>>1,ans=0;
69     while (l<=r)
70     {
71         int mid=l+r>>1;
72         if (check(mid)) ans=mid,l=mid+1; else r=mid-1;
73     }
74     printf("%d\n",ans>=4?ans+1:0);
75 }
76
77 int main(int argc, char const *argv[])
78 {
79     while (n=ra())
80     {
81         int last;
82         memset(v,0,sizeof(v));
83         for (int i=1; i<=n; i++)
84         {
85             int x=ra();
86             if (i!=1) a[i-1]=x-last+100;
87             last=x;
88         }
89         n--; work();
90         solve();
91     }
92     return 0;
93 }

转载于:https://www.cnblogs.com/ccd2333/p/6642193.html

poj1743 Musical Theme相关推荐

  1. [POJ1743]Musical Theme

    可以先看这篇论文,它有助于理解 如果理解了并且想知道细化的严格证明,可以看这篇论文 题意:给一个数字串,求不可重叠的相似子串,两个子串$a,b$相似的定义是$a_i-b_i$都相等 昨晚二爷讲课,去膜 ...

  2. Musical Theme pku1743 (后缀数组)

    Musical Theme(后缀数组) 题意: n个数,选取一段子序列,满足以下条件: 1.长度至少为5 2.在数列中其他位置出现过(允许转置) 3.与其他位置出现的不重叠 转置:将恒定的正或负值添加 ...

  3. 【POJ No. 1743】音乐主题 Musical Theme

    [POJ No. 1743]音乐主题 Musical Theme 北大OJ 题目地址 [题意]音乐旋律被表示为N (1≤N ≤20000)个音符的序列,它们是[1, 88]内的整数,每个音符都代表钢琴 ...

  4. Musical Theme

    http://poj.org/problem?id=1743 题意:给n个数组成的串,求是否有多个"相似"且不重叠的子串的长度大于等于5,两个子串相似当且仅当长度相等且每一位的数字 ...

  5. POJ - 1743 Musical Theme(二分+后缀数组+差分数组)

    题目链接:点击查看 题目大意:给出n个连续的数字组成的序列,现在要求出其中两个不重叠的字序列,满足两个子序列"相似",相似的定义是两个子序列当且仅当长度相等并且每一位的数字差都相等 ...

  6. Musical Theme POJ - 1743(后缀数组+二分)

    求不可重叠最长重复子串 对于height[i]定义为sa[i]和 sa[i-1]的最长公共前缀 这个最长公共前缀的值肯定是最大的 证明: 设rank[j] < rank[k], 则不难证明后缀j ...

  7. 后缀数组(未完待续)

    后缀数组 简介 后缀数组(Suffix Array, SA)是一种在字符串问题中很实用的工具,其主要作用是求多模板匹配和最长公共前缀(LCP).与 AC自动机 预先处理模板串不同,后缀数组在进行多模板 ...

  8. linux中的crontab文件位置,linux crontab 文件位置和日志位置

    一.文件位置 位置一般在/var/spool/cron/下,如果你是root用户,那下面有个root文件,建议日常备份,避免误删除导致crontab 文件丢失: 二.日志文件位置 默认情况下,cron ...

  9. poj1743(后缀数组+二分--不可重叠最长重复子串)

    题目:Musical Theme #include <stdio.h> #include <string.h> #define N 1000010 int wa[N],wb[N ...

最新文章

  1. iOS-获取当前时间的年、月、日、时、分、秒
  2. MDT2012部署系列之10 Win7镜像捕获与系统安装
  3. 服务器智能监控软件,监控 监控系统 消防智能监控 智能监控软件
  4. matlab怎么重复一个数字,有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?用matlab编程怎么编...
  5. 【Python3】Python模块与包的导入
  6. Access to script at ‘xxx‘ from origin ‘null‘ has been blocked by CORS policy: Cross origin requests
  7. go连接mysql集群_什么是MySQL集群-Go语言中文社区
  8. JAVA----爬虫(一)JSoup
  9. linux 编辑器vim配置
  10. python3 selenium ie 拒绝连接报错_Python3+selenium配置常见报错解决方案
  11. mysql做wp网站_mysql做wp网站
  12. 自定义简单控件之标题控件
  13. Linux的顶级十六进制编辑器
  14. java jdk9_jdk9下载-jdk9下载9.0.4 官方最新版-西西软件下载
  15. 邱锡鹏DL经典教材-《神经网络与深度学习》
  16. 【uart篇】synopsys uart vip配置使用
  17. 如何十步写好一份值钱的商业计划书
  18. 教你快速搭建个人网站
  19. 香港流行乐黄金二十年——经典歌手(音乐人)全面回顾 三
  20. 【 第一章:初识 ts】

热门文章

  1. PHP从零开始--基础篇
  2. javascript --- 函数的柯里化 Vue 2.x中柯里化的使用
  3. macOS下安装ipython
  4. 锡山国土推行数据中心“在线变更”
  5. JNI学习积累之一 ---- 常用函数大全
  6. No resource found that matches the given name 'android:Widget.Material.A解决方案
  7. [转载]CentOS6nbsp;快速搭建轻量级远程桌面nbsp;Xfcenb
  8. 选择什么样的时机将IT运维服务外包
  9. Linux下高性能网络编程中的几个TCP/IP选项_SO_REUSEADDR、SO_RECVBUF、SO_SNDBUF、SO_KEEPALIVE、SO_LINGER、TCP_CORK、TCP_NODE
  10. 联合体(union)和结构体(struct)的区别