链接 \(Click\) \(Here\)

人生第一道后缀数组的题目。首先要对输入的串进行差分处理,差分后长度为(\(n - 1\))的相同子段就是原串中长度为\(n\)的相同(可变调)子段。求出来\(height\)以后,二分一个最大不相交重复子段长度,在\(can\_use\)里面维护长度为\(k\)的段划分,判断不相交只要用\(sa\)的差值算一下长度就好。

\(p.s.\)细节真的很多。

#include <bits/stdc++.h>
using namespace std; const int N = 5010; int n, m = 255, s[N], sa[N], rk[N], tp[N], _rk[N], bin[N], height[N]; void base_sort () {
for (int i = 0; i <= m; ++i) bin[i] = 0;
for (int i = 1; i <= n; ++i) bin[rk[tp[i]]]++;
for (int i = 1; i <= m; ++i) bin[i] += bin[i - 1];
for (int i = n; i >= 1; --i) sa[bin[rk[tp[i]]]--] = tp[i];
} void suffix_sort () {
for (int i = 1; i <= n; ++i) {
rk[i] = s[i];
tp[i] = i;
}
base_sort ();
for (int w = 1; w <= n; w <<= 1) {
int cnt = 0;
for (int i = n - w + 1; i <= n; ++i) {
tp[++cnt] = i;
}
for (int i = 1; i <= n; ++i) {
if (sa[i] > w) {
tp[++cnt] = sa[i] - w;
}
}
base_sort ();
memcpy (_rk, rk, sizeof (rk));
rk[sa[1]] = cnt = 1;
for (int i = 2; i <= n; ++i) {
rk[sa[i]] = _rk[sa[i]] == _rk[sa[i - 1]] && _rk[sa[i] + w] == _rk[sa[i - 1] + w] ? cnt : ++cnt;
}
if (cnt == n) break;
m = cnt;
}
} void get_height () {
int k = 0;
for (int i = 1; i <= n; ++i) {
if (k != 0) k = k - 1;
int j = sa[rk[i] - 1];
while (s[i + k] == s[j + k]) {
k = k + 1;
}
height[rk[i]] = k;
}
} const int INF = 0x3f3f3f3f; bool can_use (int k) {
//是否有长度>=k的不交叉子串
int max_sa = sa[1], min_sa = sa[1];
for (int i = 2; i <= n; ++i) {
if (height[i] >= (k - 1)) {
//即原串中旋律长度 >= k
max_sa = max (max_sa, sa[i]);
min_sa = min (min_sa, sa[i]);
if (max_sa - min_sa >= k) {
return true;
}
} else {
max_sa = sa[i];
min_sa = sa[i];
}
}
return false;
} int main () {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> s[i];
}
for (int i = n; i >= 1; --i) {
s[i] = s[i] - s[i - 1] + 90;
//把s差分,出现n-1个相同项说明最长为n
}
// printf ("str Test : "); for (int i = 1; i <= n; ++i) printf ("%3d ", s[i]); putchar ('\n');
suffix_sort ();
get_height ();
// printf ("height Test : "); for (int i = 1; i <= n; ++i) printf ("%3d ", height[i]); printf ("\n");
int l = 0, r = n;
while (l < r) {
// printf ("l = %d, r = %d\n", l, r);
int mid = (l + r + 1) >> 1;
if (can_use (mid)) {
//存在长度 >= mid的不交叉子串
l = mid;
} else {
r = mid - 1;
}
}
if (l < 5) printf ("0\n");
else printf ("%d\n", l);
}

Luogu P2743 [USACO5.1]乐曲主题Musical Themes的更多相关文章

  1. [USACO5.1] 乐曲主题Musical Themes

    题目链接:戳我 Emmm......hash怎么做啊不会啊 这里是SA后缀数组版本的 就是先两两做差分,作为要处理后缀的数组.普通地求出来h数组之后,我们二分这个答案,然后判定是否合法就行了.是否合法 ...

  2. 洛谷P2743 乐曲主题Musical Themes [USACO5.1] SA

    正解:SA 解题报告: 传送门 这题三个条件嘛,那就一个个考虑下都解决了就把这题解决了嘛QwQ 那就直接分别针对三个条件写下各个击破就欧克辣? 1)长度大于等于5:求出答案之后和5比大小 2)不能有公 ...

  3. 乐曲主题Musical Themes

    SA例题 题面 对于串 \(S\) 的两个子串 \(A\) 和 \(B\) ,满足 \(k = |A| = |B|\),\(\exists c \forall i\, a_i + c=b_i\),且 ...

  4. P2743(poj1743) Musical Themes[差分+后缀数组]

    P2743 乐曲主题Musical Themes(poj1743) 然后呢这题思路其实还是蛮简单的,只是细节特别多比较恶心,忘记了差分带来的若干疏漏.因为转调的话要保证找到相同主题,只要保证一段内相对 ...

  5. [转]jQuery EasyUI 扩展-- 主题(Themes)

    主题(Themes)允许您改变站点的外观和感观.使用主题可以节省设计的时间,让您腾出更多的时间进行开发.您也可以创建一个已有主题的子主题. 主题生成器(Theme Builder) jQuery UI ...

  6. USACO Section 5.1 Musical Themes(枚举)

    直接枚举O(n^3)会TLE,只要稍微加点优化,在不可能得到更优解时及时退出.其实就是道水题,虽说我提交了6次才过= =..我还太弱了 -------------------------------- ...

  7. USACO 5.1 Musical Themes(哈希+二分)

    Musical ThemesBrian Dean A musical melody is represented as a sequence of N (1 <= N <= 5000) n ...

  8. [Luogu P1345] [USACO5.4]奶牛的电信Telecowmunication (最小割)

    题面 传送门:https://www.luogu.org/problemnew/show/P1345 ] Solution 这道题,需要一个小技巧了解决. 我相信很多像我这样接蒟蒻,看到这道题,不禁兴 ...

  9. [USACO5.1] Musical Themes

    后缀数组求最长重复且不重叠子串. poj 1743 传送门 洛谷 P2743 传送门 1.子串可以“变调”(即1 3 6和3 5 8视作相同).解决办法:求字符串相邻元素的差形成新串.用新字符串求解最 ...

随机推荐

  1. SVN连接不上,Host地址问题

    链接https://svn.ct-ec:8888/svn/189cn-document C:\Windows\System32\drivers\etc 单独换成单行,就好了.

  2. matlab颜色映射colormap() pcolor()

    http://blog.csdn.net/qq_20823641/article/details/51711618

  3. SharePoint 2013 使用 RBS 功能将二进制大型对象 BLOB 存储在内容数据库外部。

    为每个内容数据库设置 BLOB 存储   启用并配置 FILESTREAM 之后,请按照以下过程在文件系统中设置 BLOB 存储.必须为要对其使用 RBS 的每个内容数据库设置 BLOB 存储. 设置 ...

  4. codeforces259B

    Little Elephant and Magic Square CodeForces - 259B Little Elephant loves magic squares very much. A  ...

  5. 前端nginx+Java后台ftp处理页面图片上传踩坑

    今天,将前端代码部署到服务器nginx上,在测试多图片上传时,报错413请求体空间太大,请求都没到后台,直接被nginx拦截,调整后又报错504. 整体而言,前端存在两处问题: 413 错误 :Req ...

  6. Django+Xadmin打造在线教育系统(二)

    基于xadmin的后台管理 先使用pip进行安装xadmin及其依赖包 pip install django-adminx 安装完成后卸载xadmin,保留依赖包即可 pip uninstall dj ...

  7. 【XSY2729】欧拉子图 无向图连通性 数学

    题目大意 给你一个\(n\)个点\(m\)条边的无向图(可能有重边),对于这个图的边集的子集(一共有\(2^m\)个),如果其导出的子图的每个联通块内都存在欧拉回路,我们就把答案加上这个子图的边数的平 ...

  8. python3 fileinput模块

    模块fileinput可以对一个或多个文件的内容所有行进行迭代.遍历等操作: 常用方法: fileinput.input(files=None, inplace=False, backup='', b ...

  9. 【BZOJ5212】[ZJOI2018]历史(Link-Cut Tree)

    [BZOJ5212][ZJOI2018]历史(Link-Cut Tree) 题面 洛谷 BZOJ 题解 显然实际上就是给定了一棵树和每个点被\(access\)的次数,求解轻重链切换的最大次数. 先考 ...

  10. 【原】cpu消耗高,查看对应的线程栈信息

    在压测过程中,有时候cpu会飙升,造成这种现象的原因很多, 可能是gc造成的,也可能是某个方法造成的, 如果从找对应的方法入手,下面简单罗列下步骤: 1.top,获取pid 下面cpu消耗90%左右 ...