【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 ...
随机推荐
- caddy server && caddyfile
This page describes how to configure Caddy using the Caddyfile. Introduction The term "Caddyfil ...
- 使用dnSpy对目标程序(EXE或DLL)进行反编译修改并编译运行
本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 本文使用的工具下载地址为: https://github.com/cnxy/dnSpy/arc ...
- Hadoop序列化与Writable接口(一)
Hadoop序列化与Writable接口(一) 序列化 序列化(serialization)是指将结构化的对象转化为字节流,以便在网络上传输或者写入到硬盘进行永久存储:相对的反序列化(deserial ...
- sklearn: TfidfVectorizer 中文处理及一些使用参数
TfidfVectorizer可以把原始文本转化为tf-idf的特征矩阵,从而为后续的文本相似度计算,主题模型,文本搜索排序等一系列应用奠定基础.基本应用如: #coding=utf-8 from s ...
- laravel 环境自编译过程
[原创] 看到此文的朋友看完后也许会失望,但我尽最大努力不让搜友们失望,以下是自己操作的笔记用以整理提高 虽然 laravel 官方已给出了安装 laravel 框架所需的环境盒子 使用Vagrant ...
- 使用Java读取配置文件
实现起来,相对比较简单,留个备案吧,废话也不多说,请看代码: package com.jd.***.config; import org.junit.*; import java.io.IOExcep ...
- PHp引用,函数引用,对象引用(初学者必看)
转自:http://blog.sina.com.cn/s/blog_948254830100vs2e.html 收集整理: 第 二 教 育 资 源 网 在PHP 中引用的意思是:不同的名字访问同一个变 ...
- Go - 指针简介 与 ++/--运算符以及控制语句
指针 Go 语言中,对于指针有一些特殊约束: 1. 不在支持 “->” 符号,所有的指针使用“.” 来操作指针对象的成员变量 2. 指针的默认值为 “nil” ++ 与 -- 作为语句而非表达式 ...
- Window下MySql 5.6 安装后内存占用很高的问题
Window下MySql 5.6 安装后内存占用很高的问题 刚刚准备玩一把mysql,初学者 环境是window 7和window sever 2008, mysql是最新的5.6, 发现的问题是安装 ...
- hdu-1052-Tian Ji -- The Horse Racing(经典)
/* hdu-1052 Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/3 ...