#1415 : 后缀数组三·重复旋律3 (最长公共子串)
思路
将两个字符串合成一个字符串,中间加上一个"#"。然后求height[i]height[i]height[i]。
最长公共子串如果存在,必定是相邻的height[i]height[i]height[i],求最大值的时候判断是否是来自两个不同的子串。
#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
#define endl '\n'
const int maxn = 2e5 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
using namespace std;
int cntA[maxn], cntB[maxn], A[maxn], B[maxn];
int Sa[maxn], tsa[maxn], height[maxn], Rank[maxn];
char s[maxn];
int n;
void SuffixArray () {for (int i = 0; i < 1000; ++i) cntA[i] = 0;for (int i = 1; i <= n; ++i) cntA[(int)s[i]]++;for (int i = 1; i < 1000; ++i) cntA[i] += cntA[i-1];for (int i = n; i >= 1; --i) Sa[ cntA[(int)s[i]]-- ] = i;Rank[ Sa[1] ] = 1;for (int i = 2; i <= n; ++i) {Rank[Sa[i]] = Rank[Sa[i-1]];if (s[Sa[i]] != s[Sa[i-1]]) Rank[Sa[i]]++;}for (int l = 1; Rank[Sa[n]] < n; l <<= 1) {for (int i = 0; i <= n; ++i) cntA[i] = 0;for (int i = 0; i <= n; ++i) cntB[i] = 0;for (int i = 1; i <= n; ++i) {cntA[ A[i] = Rank[i] ]++;cntB[ B[i] = (i + l <= n) ? Rank[i+l] : 0]++;}for (int i = 1; i <= n; ++i) cntB[i] += cntB[i-1];for (int i = n; i >= 1; --i) tsa[ cntB[B[i]]-- ] = i;for (int i = 1; i <= n; ++i) cntA[i] += cntA[i-1];for (int i = n; i >= 1; --i) Sa[ cntA[A[tsa[i]]]-- ] = tsa[i];Rank[ Sa[1] ] = 1;for (int i = 2; i <= n; ++i) {Rank[Sa[i]] = Rank[Sa[i-1]];if (A[Sa[i]] != A[Sa[i-1]] || B[Sa[i]] != B[Sa[i-1]]) Rank[Sa[i]]++;}}for (int i = 1, j = 0; i <= n; ++i) {if (j) --j;int tmp = Sa[Rank[i] - 1];while (i + j <= n && tmp + j <= n && s[i+j] == s[tmp+j]) ++j;height[Rank[i]] = j;}
}
int pos;
int check (int a, int b) {if (a < pos && b > pos) return 0;return 1;
}int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);s[0] = ' ';scanf("%s", s+1);int len = strlen(s);s[len] = '#';pos = len;scanf("%s", s + len + 1);n = strlen(s) - 1;SuffixArray();int ans = 0;for (int i = 1; i <= n; ++i) {int a = Sa[i];int b = Sa[i - 1];if (a > b) swap(a, b);if (height[i] <= ans || check(a, b)) continue;ans = height[i];// ans = max(ans, min(height[i], pos - a));}cout << ans << endl;return 0;
}
#1415 : 后缀数组三·重复旋律3 (最长公共子串)相关推荐
- hiho一下120周 后缀数组一·重复旋律
后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...
- hihocoder 1449 : 后缀自动机三·重复旋律6(后缀自动机)
#1449 : 后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- I - 后缀数组二·重复旋律2 HihoCoder - 1407
描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律. 旋律可以表示为一段连续的数列,相似的旋律 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
- hihoCoder #1449 : 后缀自动机三·重复旋律6
题目链接 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中 ...
- #1419 : 后缀数组四·重复旋律4 (重复次数最多的连续字串)
题目链接 思路 如何求一个串中的最大重复次数? 枚举循环节的大小,判断它是否合法. 如何快速判断循环节合法? LCP(LCP(LCP(原串, 原串−-−循环节)))是否完全匹配. 如何快速求串AAA和 ...
- #1407 : 后缀数组二·重复旋律2 (不可重叠最长重复子串问题)
题目链接 思路 求不可重叠最长重复子串,也可以利用height[i]height[i]height[i]. 二分枚举答案KKK 当height[i]≥Kheight[i] \ge Kheight[i] ...
- #1403 : 后缀数组一·重复旋律 (可重叠最长重复K次子串问题)
题目链接 思路 K=2K = 2K=2时就是求height[i]height[i]height[i]的最大值. K≠2K =\not 2K≠2时就是连续K−1K-1K−1个height[i]he ...
- hiho一下第128周 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
最新文章
- GitHub 上有哪些适合新手跟进的优质项目?(附地址)
- Yann LeCun:假如没有深度学习,Facebook就是尘埃
- 利用Spring-Boot解析Excel、用Java分析Excel、告别手动输入用程序读取Excel
- 关于缓存雪崩\穿透\击穿等一些问题
- 第六十五期:IBM净利润下降38%,旧时代巨头如何自救?
- 大数据架构师指南 pdf_ZTE十年大数据架构师教你:高效搭建企业IT系统架构,超越CTO...
- day20——安装客户端、数据库连接、mysql事务、mysql操作数据
- Ubuntu下LDAP 部署文档
- TechNet Plus订阅版再度推出6折优惠
- 圆钢孔型计算机模拟,第五章 金属塑性加工ppt课件.ppt
- spyder python调试查看类信息_Python调试工具-Spyder
- Verilog 练习 7段数码管译码器
- 用C语言画一个Q版奥特曼
- SSL常见错误及解决方法
- 用户需求调研—快速上手篇
- ArcBlock冒志鸿 |“联网+DID”区块链应用破局的关键
- java画板中画直线_java实现画图板上画一条直线
- ERROR 1819 (HY000) Your password does not satisfy the current policy requirements
- linux uname命令的使用
- Oracle时间与Unix时间戳的转换