【poj1743】Musical Theme 【后缀自动机】
题意
给出一个n个数字的序列,找出相同变化趋势且不重叠的两个最长子串。
分析
这个题以前应该用后缀数组+二分做过。学了后缀自动机后可以用后缀自动机搞一下。
先差分,然后把查分后的数组建SAM。然后对于每个状态记录一个l[u],和r[u],分别代表right集合中,最大的v和最小的v。(这里如果不明白可以去看clj的课件)。
然后对于每个状态,当这个状态cnt[u]>=2的时候,说明有两个以上的子串,然后min(st[u].len,r[u]-l[u])就是这个状态最长不重叠相同子串的长度。
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
const int maxn=+;
const int INF=;
int s[maxn],a[maxn],n;
struct state{
int len,link;
int next[];
}st[*maxn];
int last,cur,sz;
int cnt[*maxn],l[*maxn],r[*maxn],c[*maxn];
void init(){
sz=;
last=cur=;
st[].len=;
st[].link=-;
memset(st[].next,,sizeof(st[].next));
} void build_sam(int c,int pos){
cur=sz++;
st[cur].len=st[last].len+;
cnt[cur]=;
l[cur]=r[cur]=pos;
memset(st[cur].next,,sizeof(st[cur].next));
int p;
for(p=last;p!=-&&st[p].next[c]==;p=st[p].link)
st[p].next[c]=cur;
if(p==-)
st[cur].link=;
else{
int q=st[p].next[c];
if(st[q].len==st[p].len+)
st[cur].link=q;
else{
int clone=sz++;
cnt[clone]=r[clone]=;
l[clone]=;
st[clone].len=st[p].len+;
//printf("%d ",st[clone].len);
st[clone].link=st[q].link;
memcpy(st[clone].next,st[q].next,sizeof(st[clone].next));
for(;p!=-&&st[p].next[c]==q;p=st[p].link){
st[p].next[c]=clone;
}
st[cur].link=st[q].link=clone;
}
}
last=cur;
}
int cmp(int a,int b){
return st[a].len>st[b].len;
} int ans=;
int main(){
while(scanf("%d",&n)!=EOF&&n){
for(int i=;i<=n;i++){
scanf("%d",&s[i]);
a[i]=s[i]-s[i-];
}
init();
for(int i=;i<=n;i++){
build_sam(a[i]+,i);
//printf("%d ",a[i]);
}
// for(int i=0;i<sz;i++)
// printf("%d ",st[i].len);
// printf("\n");
for(int i=;i<sz;i++)
c[i]=i;
sort(c,c+sz,cmp);
ans=;
for(int i=;i<sz;i++){
int o=c[i];
if(st[o].link!=-){
cnt[st[o].link]+=cnt[o];
l[st[o].link]=min(l[st[o].link],l[o]);
r[st[o].link]=max(r[st[o].link],r[o]);
}
// printf("%d %d %d %d\n",cnt[o],st[o].len,l[o],r[o]);
if(cnt[o]>=&&min(st[o].len,r[o]-l[o])>=){
//printf("%d %d\n",l[o],r[o]);
ans=max(ans,min(st[o].len,r[o]-l[o]));
}
}
if(ans<)
printf("0\n");
else
printf("%d\n",ans+);
}
return ;
}
【poj1743】Musical Theme 【后缀自动机】的更多相关文章
- POJ1743 Musical Theme [后缀自动机]
题意:不重叠最长重复子串 后缀数组做法:http://www.cnblogs.com/candy99/p/6227659.html 后缀自动机的话,首先|Right|>=2 然后min(t[u] ...
- POJ1743 Musical Theme —— 后缀数组 重复出现且不重叠的最长子串
题目链接:https://vjudge.net/problem/POJ-1743 Musical Theme Time Limit: 1000MS Memory Limit: 30000K Tot ...
- POJ1743 Musical Theme [后缀数组]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- POJ1743 Musical Theme [后缀数组+分组/并查集]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- poj 1743 Musical Theme 后缀自动机/后缀数组/后缀树
题目大意 直接用了hzwer的题意 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题."主题&qu ...
- POJ1743 Musical Theme(后缀数组 二分)
Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 33462 Accepted: 11124 Description A m ...
- POJ-1743 Musical Theme(后缀数组)
题目大意:给一个整数序列,找出最长的连续变化相同的.至少出现两次并且不相重叠一个子序列. 题目分析:二分枚举长度进行判定. 代码如下: # include<iostream> # incl ...
- poj1743 Musical Theme 后缀数组的应用(求最长不重叠重复子串)
题目链接:http://poj.org/problem?id=1743 题目理解起来比较有困难,其实就是求最长有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1 ...
- POJ1743 Musical Theme (后缀数组 & 后缀自动机)最大不重叠相似子串
A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the ...
- poj1743 Musical Theme【后缀数组】【二分】
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 35044 Accepted: 11628 D ...
随机推荐
- Maven中plugins和pluginManagement的区别
pluginManagement是表示插件声明,即你在项目中的pluginManagement下声明了插件,Maven不会加载该插件,pluginManagement声明可以被继承. pluginMa ...
- Linux 文件系统目录结构
进入 Linux 根目录(即 "/",Linux文件系统的入口,也是处于最高一级的目录),运行 "ls -l" 命令,可以看到 Linux 系统目录. 1./b ...
- SpringMVC之八:基于SpringMVC拦截器和注解实现controller中访问权限控制
SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...
- Eclipse中设置JDK、${user}变量
为eclipse设置jdk方法: 两个方法: 1.设置PATH路径-eclipse自动会查找! 2.在快捷方式中加上参数:-VM java虚拟机路径 Eclipse中设置${user}变量 在Ecli ...
- Java-Runoob:Java Stream、File、IO
ylbtech-Java-Runoob:Java Stream.File.IO 1.返回顶部 1. Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出 ...
- HTTP客户端之使用request方法向其他网站请求数据
在node中,可以很轻松的向任何网站发送请求并读取该网站的响应数据. var req=http.request(options,callback); options是一个字符串或者是对象.如果是字符串 ...
- node中转换URL字符串与查询字符串
一个完整的URL字符串中,从"?"(不包括?)到"#"(如果存在#)或者到该URL字符串结束(如果不存在#)的这一部分称为查询字符串. 可以使用Query St ...
- canvas之旋转一条线段
<canvas id="canvas" width="600" height="500" style="background ...
- 【BZOJ】1441 Min(数学)
题目 传送门:QWQ 分析 裴蜀定理. 因为存在 $ a_1 $ $ a_2 $...... $ a_n $的最大公约数为 $ d $,那么必定存在 $ x_1*a_1+x_2*a_2+...x_n* ...
- sql sever数据库常用的执行语句
--使用master数据库use master --创建数据库文件create database 数据库名字 on( name=, --逻辑名称 filename= .ndf, --数据文件物理路径名 ...