题目链接 \(Click\) \(Here\)

真的好麻烦啊。。事实证明,理解是理解,一定要认认真真把板子打牢,不然调锅的时候真的会很痛苦。。(最好是八分钟能无脑把\(SA\)码对的程度\(QAQ\))

这个题最开始我想的是\(RMQ\)遍历每一个子区间,但是意识到复杂度是\(O(N^2)\)然后就\(GG\)了。怎么说呢,后缀数组和二分似乎是很常见的组合(和莫队也是?),这个题只需要在\(height\)数组里二分\(lcp\)长度即可,\(check\)函数里面处理一下,要让区间内所有原串都有至少一个子串。

#include <bits/stdc++.h>
using namespace std;const int N = 200010;int s[N], id[N];
int n, m, num, len, tot = 10000;
int sa[N], tp[N], rk[N], _rk[N], bin[N], height[N];void get_height (int n) {int k = 0;for (int i = 1; i <= n; ++i) {if (k != 0) k--;int j = sa[rk[i] - 1];while (s[i + k] == s[j + k]) k++;height[rk[i]] = k;}
}void base_sort (int n, int m) {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 (int n, int m) {for (int i = 1; i <= n; ++i) {rk[i] = s[i];tp[i] = i;}base_sort (n, m);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 (n, m);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;}
}bool vis[1010]; int sta[N], top = 0;bool can_use (int l) {while (top) vis[sta[top--]] = false;for (int i = 1; i <= len; ++i) {if (height[i] < l) {while (top) vis[sta[top--]] = false;}if (!vis[id[sa[i]]]) {vis[id[sa[i]]] = true;sta[++top] = id[sa[i]];if (top == n) return true;}}return false;
}int main () {cin >> n;int ban = 2000;for (int i = 1; i <= n; ++i) {cin >> m;for (int j = 1; j <= m; ++j) {cin >> s[++len]; //把所有的字符串整合到一个里id[len] = i; // 表明主权(len号后缀(的lcp)属于串i)}s[++len] = ++ban; //隔开}for (int i = len; i >= 1; --i) {s[i] = s[i] - s[i - 1] + 4000;}suffix_sort (len, 10000);get_height (len);int l = 0, r = len;while (l < r) {int mid = (l + r + 1) >> 1;if (can_use (mid)) {l = mid;} else {r = mid - 1;}}cout << l + 1 << endl;
}

转载于:https://www.cnblogs.com/maomao9173/p/10438209.html

Luogu P2463 [SDOI2008]Sandy的卡片相关推荐

  1. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

  2. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)

    题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...

  3. 洛咕 P2463 [SDOI2008]Sandy的卡片

    哈希水过. 首先这是一段delta相同的序列,按照套路差分一下,b[i]=a[i]-a[i-1],然后就是这些序列的最长公共子段 由于数据范围很小,就可以二分,枚举第一个序列的子段然后每个子序列暴力c ...

  4. 【bzoj4698】[Sdoi2008] Sandy的卡片 后缀数组

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列 ...

  5. [SDOI2008]Sandy的卡片

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...

  6. 4698: Sdoi2008 Sandy的卡片

    前言 总之这个东西说起来很麻烦就是了, 思路 差分合并+后缀数组+二分(dddl) 类似于那个bzoj1031的复制子串和那个poj1743的差分 来看个例子 3 5 1 2 3 4 5 4 1 1 ...

  7. BZOJ4698: Sdoi2008 Sandy的卡片

    题解: 裸后缀数组+二分答案 /**************************************************************Problem: 4698User: c20 ...

  8. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

    差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...

  9. [luoguP2463] [SDOI2008]Sandy的卡片(后缀数组 + st表)

    传送门 很容易想到,题目中的相同是指差分数组相同. 那么可以把差分数组连起来,中间加上一个没有出现过的且字典序小的数 双指针移动,用st表维护height数组中的最小值. 当然用单调队列应该也可以且更 ...

最新文章

  1. matlab sperman相关,相关系数
  2. Windows Server 2008 R2 之部署DHCP群集 序
  3. linux命令grep如何使用,Linux下如何使用grep搜索文本
  4. [原]软件设计的一些感悟
  5. 为什么Internet选择分组交换而不是电路交换_1012.网络设备:中继器、集线器、网桥、交换机、路由器、网关...
  6. liferay 如何 用 国际化
  7. xshell使用xftp传输文件和使用pure-ftpd搭建ftp服务
  8. 他说:越成熟,越觉得自己平庸
  9. 感恩的心,感谢有你--51CTO!
  10. [原创]java WEB学习笔记36:Java Bean 概述,及在JSP 中的使用,原理
  11. html table的边框线怎么变圆角_实现CSS3中的border-radius(边框圆角)示例代码
  12. 导弹如何自动追踪目标?这其实是个数学问题
  13. react开发教程(九)redux基础
  14. 十种经典运放电路分析
  15. 第十周、第十一周学习总结
  16. 史上最全的鸿蒙学习资料——润和满天星系列Pegasus资料汇总
  17. 关于TPC协议知识汇总
  18. H5新增标签以及常用标签
  19. google map v3离线版地图
  20. 计算机信息技术课程论文,信息技术教学论文

热门文章

  1. qt鼠标进入窗体后,窗体自动置顶
  2. 程序猿 - 超实用的工具、素材、学习网站分享
  3. CTF-Crypto密码学
  4. python安装poi第三方库_使用Python获取城市POI数据
  5. python外星人入侵怎么发给别人_python_外星人入侵(1-1)
  6. dedecms联动筛选_DEDECMS分类信息按联动类别筛选的实现方法
  7. 如何清理和维护计算机,电脑的优化与维护操作教程
  8. 任务计划命令 linux,linux执行一次性任务计划at命令
  9. 战队服务器人员位置,和平精英:职业战队如何分配成员位置?5大定位划出5种职位...
  10. java dos窗口小工具下载,maxdos 9 3-maxdos工具箱 v9.3 官方版