题意:给出一串序列,求最长的theme长度

(theme:完全重叠的子序列,如1 2 3和1 2 3  or  子序列中每个元素对应的差相等,如1 2 3和7 8 9)

要是没有差相等这个条件那就好办多了,直接裸题。

一开始想了个2B方法,后来发现真心2B啊蛤蛤蛤

 for i= to  do
{
for j= to length
{
r2[j]=r[j]+i;
if (r2[j]>) r2[i]-=;
}
把新序列r2连接到原序列r的后面
process[r+r2]
.....
求for i=->88中得到的最大答案
}

正解:http://bbezxcy.iteye.com/blog/1407395

对原序列相邻两元素作差就行了= =

比如:序列8 8 8 15 24 3 3 3

作差得到0 0 7 9 -21 0 0

对新序列再求最长不重叠重复子串,得到的结果+1,就是原序列的最长不重叠重复子串

求最长不重叠重复子串:参考IOI2009论文

Code:

 #include "stdio.h"
#include "string.h"
#define maxn 20010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int rank[maxn],height[maxn];
int r[maxn],sa[maxn],ans[maxn];
int n; int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
} void da(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=; i<m; i++) ws[i]=;
for(i=; i<n; i++) ws[x[i]=r[i]]++;
for(i=; i<m; i++) ws[i]+=ws[i-];
for(i=n-; i>=; i--) sa[--ws[x[i]]]=i;
for(j=,p=; p<n; j*=,m=p)
{ for(p=,i=n-j; i<n; i++) y[p++]=i;
for(i=; i<n; i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=; i<n; i++) wv[i]=x[y[i]];
for(i=; i<m; i++) ws[i]=;
for(i=; i<n; i++) ws[wv[i]]++;
for(i=; i<m; i++) ws[i]+=ws[i-];
for(i=n-; i>=; i--) sa[--ws[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=,x[sa[]]=,i=; i<n; i++)
x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
return;
} void calheight(int *r,int *sa,int n)
{
int i,j,k=;
for(i=; i<=n; i++) rank[sa[i]]=i;
for(i=; i<n; height[rank[i++]]=k)
for(k?k--:,j=sa[rank[i]-]; r[i+k]==r[j+k]; k++);
return;
} bool calc(int x)
{
int nm=;
for (int i=;i<=n;i++)
if (height[i]<x)
{
nm++;
ans[nm]=i;
}
nm++;
ans[nm]=n+;
for (int i=;i<nm;i++)
{
int tl=ans[i],tr=ans[i+]-;
int tn=maxn,tx=;
for (int j=tl;j<=tr;j++)
{
if (tn>sa[j]) tn=sa[j];
if (tx<sa[j]) tx=sa[j];
}
if (tx-tn>=x) return true;
}
return false;
} //da(r,sa,n+1,128);
//calheight(r,sa,n);
int main()
{
// freopen("in.txt","r",stdin);
while (~scanf("%d",&n))
{
if (n!=)
{
memset(sa,,sizeof(sa));
memset(height,,sizeof(height));
memset(ans,,sizeof(ans)); for (int i=; i<n; i++)
scanf("%d",&r[i]);
r[n]=; // for (int i=0;i<=n;i++)
// printf("%d ",r[i]);
// printf("\n %d\n",n); for (int i=;i<n;i++)
r[i-]=r[i]-r[i-];
n--;
r[n]=; for (int i=;i<n;i++)
r[i]+=; // for (int i=0;i<=n;i++)
// printf("%d ",r[i]);
// printf("\n %d\n",n); da(r,sa,n+,);
calheight(r,sa,n); // for (int i=0; i<=n; i++)
// printf("%d %d\n",sa[i],height[i]);
// printf("\n"); int l=maxn,r=,res=;
for (int i=;i<=n;i++)
{
if (height[i]<l) l=height[i];
if (height[i]>r) r=height[i];
}
while (r>=l)
{
int mid=(l+r)/;
if (calc(mid))
{
l=mid+;
res=mid;
}
else
r=mid-;
}
res++;
if (res<) res=;
printf("%d\n",res);
}
}
return ;
}

本题出自USACO5.1 theme,据说是男人八题之一.....orz

poj 1743 二分答案+后缀数组 求不重叠的最长重复子串的更多相关文章

  1. poj 3261 二分答案+后缀数组 求至少出现k次的最长重复子序列

    #include "stdio.h" #define maxn 20010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int rank[ma ...

  2. poj 3261 Milk Patterns(后缀数组)(k次的最长重复子串)

    Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7938   Accepted: 3598 Cas ...

  3. POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)

    Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. G ...

  4. POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次

    Milk Patterns   Description Farmer John has noticed that the quality of milk given by his cows varie ...

  5. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )

    二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...

  6. poj 2774 后缀数组 两个字符串的最长公共子串

    Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 31904   Accepted: 12 ...

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

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

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

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

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

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

随机推荐

  1. 使用EXISTS语句注意点

    1.使用EXISTS语句,其目标列一般用“*”,因为带EXISTS的子查询只返回真值或假值,给出列名无实际意义. 2.使用EXISTS语句一定要注意上下两个表之间要建立联系. 例如,查询所有选修了1号 ...

  2. Javascript中call和apply的区别与详解

    在js中call和apply它们的作用都是将函数绑定到另外一个对象上去运行,两者仅在定义参数方式有所区别,下面我来给大家介绍一下call和apply用法: 在web前端开发过程中,我们经常需要改变th ...

  3. Kakfa分布式集群搭建

    本位以最新版本kafka_2.11-0.10.1.0版本讲述分布式kafka集群环境的搭建过程.服务器列表: 172.31.10.1 172.31.10.2 172.31.10.3 1.下载kafka ...

  4. [资料]pthreads PHP

    1. 参考手册http://php.net/manual/zh/book.pthreads.php 2. windows下安装php真正的多线程扩展pthreads教程http://www.think ...

  5. C/C++关于string.h头文件和string类

    学习C语言时,用字符串的函数例如stpcpy().strcat().strcmp()等,要包含头文件string.h 学习C++后,C++有字符串的标准类string,string类也有很多方法,用s ...

  6. MVC3迁移MVC4相关问题

    mvc3迁移到mvc4后,发布到服务器,出现了如下错误: [A]System.Web.WebPages.Razor.Configuration.RazorPagesSection cannot be ...

  7. Arduino小车学习与研究

    信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...

  8. TPLINK GPL code 简要分析

    从TPLINK官网下载了GPL code,下载后文件名是wr841nv9_en_gpl.tar.gz, 但是无论是linux还是windows下解压都提示压缩包有问题,不过还是可以解压出完整的目录的. ...

  9. memset的使用

    今天写程序的时候用了memset这个函数,我知道他是关于清空指针的,设置为0.但我用的时候,没有注意到他是以字节为单位进行操作的,改了半天其他程序内容.要注意的是,memset是对字字进行操作,所以以 ...

  10. (转)Python实例手册

    原文地址:http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7 实在是太好的资料了,不得不转 python实例手册 #encodi ...