hihocoder-1407 后缀数组二·重复旋律2 不重合 最少重复K次
后缀数组不能直接通过Height得出不重合的公共串。我们可以二分k值,这样连续的Height只要都大于等于k,那他们互相间的k值都大于等于k。每个这样的连续区间查找SA的最大最小值,做差判断是否重合(考虑common prefix=k)。
#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#define LL long long
using namespace std;
const LL mod = ;
const LL N = ;
class SF
{
//N:数组大小
public:
int x[N], y[N], c[N];
int Height[N],str[N], SA[N], Rank[N];//Height数组从2开始
int slen;
int m=;//字符集处理大小(传入如果不是数字,需要做位移转换)
bool cmp(int* r, int a, int b, int l) {
return r[a] == r[b] && r[a + l] == r[b + l];
} void Suffix(int n) {
++n;
int i, j, p;
for (i = ; i < m; ++i) c[i] = ;
for (i = ; i < n; ++i) c[x[i] = str[i]]++;
for (i = ; i < m; ++i) c[i] += c[i - ];
for (i = n - ; i >= ; --i) SA[--c[x[i]]] = i;
for (j = ; j <= n; j <<= ) {
p = ;
for (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 < m; ++i) c[i] = ;
for (i = ; i < n; ++i) c[x[y[i]]]++; for (i = ; i < m; ++i) c[i] += c[i - ];
for (i = n - ; i >= ; --i) SA[--c[x[y[i]]]] = y[i]; swap(x, y);
p = ; x[SA[]] = ;
for (i = ; i < n; ++i) {
x[SA[i]] = cmp(y, SA[i - ], SA[i], j) ? p - : p++;
}
if (p >= n)break;
m = p;
} int k = ;
n--;
for (i = ; i <= n; ++i) Rank[SA[i]] = i;
for (i = ; i < n; ++i) {
if (k)--k;
j = SA[Rank[i] - ];
while (str[i + k] == str[j + k])++k;
Height[Rank[i]] = k;
//cout << k << endl;
}
}
void init(vector<int> &vv)
{
slen = vv.size();
for (int i = ; i < slen; i++)
str[i] = vv[i]+;//如果是字符,映射成从1开始的序列
str[slen] = ;//0作为结束符,防止越界
Suffix(slen);
}
struct nod
{
int mx, mi;
};
int ans;
bool ok(int k)
{
int temp = ;
int mx = , mi = ;
bool f = false;
for (int i = ; i <= slen; i++)
{
if (Height[i] >= k)
{
mx = max(mx, max(SA[i - ], SA[i]));
mi = min(mi, min(SA[i - ], SA[i]));
}
else
{
mx = ;
mi = ;
}
if (mx - mi >= k)f = true;
}
return f;
}
int go(int l, int r)
{
for (; r >= l; r--)
if (ok(r))return r;
return ;
}
int bins(int l, int r)
{
while (l <= r)
{
if(r-l<=)
return go(l, r);
int mid = (l + r) / ;
if (ok(mid))
l = mid;
else r = mid - ;
}
}
LL solve()
{
ans=bins(, slen);
return ans;
}
}sf;
LL dp[][];
LL n;
int main() {
cin.sync_with_stdio(false);
while (cin >> n)
{
vector<int> v;
for (int i = ; i < n; i++)
{
int num;
cin >> num;
v.push_back(num);
}
sf.init(v);
cout << sf.solve() << endl;
}
return ;
}
hihocoder-1407 后缀数组二·重复旋律2 不重合 最少重复K次的更多相关文章
- hihocoder #1407 : 后缀数组二·重复旋律2
#1407 : 后缀数组二·重复旋律2 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...
- hiho一下121周 后缀数组二·重复旋律2
后缀数组二·重复旋律2 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi ...
- hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)
#1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...
- hihocoder #1419 : 后缀数组四·重复旋律4
#1419 : 后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构 ...
- hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- hihocoder #1415 : 后缀数组三·重复旋律3
#1415 : 后缀数组三·重复旋律3 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...
- HIHOcoder 1403 后缀数组一·重复旋律
思路 后缀数组的板子题,注意后缀数组的rank[]数组是通过位置找到对应排名的,sa[]是通过排名找到位置的,height[i]记录的是sa[i]和sa[i+1]之间的lcp 不要写错了就行了 代码 ...
- HihoCoder1407 后缀数组二·重复旋律2
重复旋律2 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多 ...
- hihoCoder 1403 后缀数组 重复旋律
思路: 后缀数组 第一次写 留个模板吧 先求出后缀数组,问题转换为询问height数组中连续k-1个数的最小值的最大值,单调队列扫描一遍即可.-yousiki 手懒用得STL //By SiriusR ...
随机推荐
- 设置Eclipse具有字母自动联想
Window->Preferences->Java->Editor->ContentAssist(内容助手)里面的Enable auto activation里面第二行再加上a ...
- js 根据对象属性对数组进行按字母排序
$scope.input.sort(compare('ticked','name')); var compare = function(ticked, name){ return function(a ...
- ubuntu18.04无法安装libesd0-dev【学习笔记】
执行如下命令安装: sudo apt-get install libesd0-dev 却报了这个错误: 解决办法: sudo vim /etc/apt/sources.list //在行尾添加如下两行 ...
- 我的互联网30年。永远的8U8 永远的Y365
我的互联网30年.永远的8U8 永远的Y365
- Trimmomatic过滤Illumina低质量序列
1. 下载安装 直接去官网下载二进制软件,解压后的trimmomatic-0.36.jar即为我们需要的软件 官网: http://www.usadellab.org/cms/index.php?pa ...
- oracle 之 插入超长字段并包含&字符的处理方法
oracle 在插入超长数据字符串时是默认转为varchar2类型,而这类型只有4000字节,即使通过oracle改变字符串类型为clob,也是在插入时默认转为varchar2类型. 处理方式:可以通 ...
- 什么是mvc?
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型 (Model).视图(View)和控制器(Controller). ...
- 【NOIP 2018】Day2 T3 保卫王国
Problem Description Z 国有\(n\)座城市,\(n - 1\)条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市 ...
- 【Ruby】【遇到的问题】
1 Error fetching https://gems.ruby-china.org/: certificate verify failed (https://gems.ruby-china.or ...
- _event_active
EventId 事件ID GUID 对应creature或gameobject表中 guid,正数为生物,负数为物体 ActiveFlag 生物或物体激活时的flag,通常为0 NoticeText ...