poj 1743 二分答案+后缀数组 求不重叠的最长重复子串
题意:给出一串序列,求最长的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 二分答案+后缀数组 求不重叠的最长重复子串的更多相关文章
- poj 3261 二分答案+后缀数组 求至少出现k次的最长重复子序列
#include "stdio.h" #define maxn 20010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int rank[ma ...
- poj 3261 Milk Patterns(后缀数组)(k次的最长重复子串)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7938 Accepted: 3598 Cas ...
- 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 ...
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ...
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式( 二分答案 + 后缀数组 )
二分答案m, 后缀数组求出height数组后分组来判断. ------------------------------------------------------------ #include&l ...
- poj 2774 后缀数组 两个字符串的最长公共子串
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 31904 Accepted: 12 ...
- Poj 1743 Musical Theme(后缀数组+二分答案)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...
- Poj 1743 Musical Theme (后缀数组+二分)
题目链接: Poj 1743 Musical Theme 题目描述: 给出一串数字(数字区间在[1,88]),要在这串数字中找出一个主题,满足: 1:主题长度大于等于5. 2:主题在文本串中重复出现 ...
- POJ.1743.Musical Theme(后缀数组 倍增 二分 / 后缀自动机)
题目链接 \(Description\) 给定一段数字序列(Ai∈[1,88]),求最长的两个子序列满足: 1.长度至少为5 2.一个子序列可以通过全部加或减同一个数来变成另一个子序列 3.两个子序列 ...
随机推荐
- [Unity2D]2D Mobile Joystick
效果预览 操作步骤 1.下载素材 http://pan.bai du.com/s/1gdkQz8v 2.新建一个GUITexture(Joystick)及一个Sprite(Nyan) 3.添加背景 ...
- 利用appscan进行自动化定期安全测试
Appscan的强大众所周知,如果可以自动执行定期安全测试,岂不是美事一件? 事实上,appscan提供了计划扫描的选项,配合windows的计划任务,可以按需设定. 1.打开appscan中的“工具 ...
- java 16 -3 Vector的特有功能
/* * Vector的特有功能: * 1:添加功能 替代 * public void addElement(Object obj) -- add() * 2:获取功能 * public Object ...
- Python 栅栏凯撒
def fence_Crypto(msg,priority="row"): ''' usage: fence_Crypto(msg[, priority])->msg to ...
- 常用的adb命令
在平时的工作中,会经常用到adb命令,在这里稍微整理了一下. 一.概要 1.什么是adb? adb全称为Android Debug Bridge,就是起到调试桥的作用.顾名思义,adb就是一个debu ...
- Android Studio系列教程一--下载和安装
原文链接:http://stormzhang.com/devtools/2014/11/25/android-studio-tutorial1/ 背景 相信大家对Android Studio已经不陌生 ...
- Android Handler处理机制 ( 一 )(图+源码分析)——Handler,Message,Looper,MessageQueue
android的消息处理机制(图+源码分析)——Looper,Handler,Message 作为一个大三的预备程序员,我学习android的一大乐趣是可以通过源码学习 google大牛们的设计思想. ...
- struts2验证框架1
<!--该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理.如果用户需要指定多个请求后缀,则多个后缀之间以英文逗 ...
- 课程2——变量修饰关键字
声明:本系列随笔主要用于记录c语言的常备知识点,不能保证所有知识正确性,欢迎大家阅读.学习.批评.指正!!你们的鼓励是我前进的动力.严禁用于私人目的.转载请注明出处:http://www.cnblog ...
- js中的预加载与懒加载(延迟加载)
js中加载分两种:预加载与延迟加载 一. 预加载,增强用户的体验,但会加载服务器的负担.一般会使用多种 CSS(background).JS(Image).HTML(<img />) . ...