思路

将两个字符串合成一个字符串,中间加上一个"#"。然后求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 (最长公共子串)相关推荐

  1. hiho一下120周 后缀数组一·重复旋律

    后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...

  2. hihocoder 1449 : 后缀自动机三·重复旋律6(后缀自动机)

    #1449 : 后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

  3. I - 后缀数组二·重复旋律2 HihoCoder - 1407

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多曲子以后发现很多作品自身包含一样的旋律. 旋律可以表示为一段连续的数列,相似的旋律 ...

  4. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

  5. hihoCoder #1449 : 后缀自动机三·重复旋律6

    题目链接 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中 ...

  6. #1419 : 后缀数组四·重复旋律4 (重复次数最多的连续字串)

    题目链接 思路 如何求一个串中的最大重复次数? 枚举循环节的大小,判断它是否合法. 如何快速判断循环节合法? LCP(LCP(LCP(原串, 原串−-−循环节)))是否完全匹配. 如何快速求串AAA和 ...

  7. #1407 : 后缀数组二·重复旋律2 (不可重叠最长重复子串问题)

    题目链接 思路 求不可重叠最长重复子串,也可以利用height[i]height[i]height[i]. 二分枚举答案KKK 当height[i]≥Kheight[i] \ge Kheight[i] ...

  8. #1403 : 后缀数组一·重复旋律 (可重叠最长重复K次子串问题)

    题目链接 思路 K=2K = 2K=2时就是求height[i]height[i]height[i]的最大值. K≠2K =\not 2K≠​2时就是连续K−1K-1K−1个height[i]he ...

  9. hiho一下第128周 后缀自动机二·重复旋律5

    #1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

最新文章

  1. GitHub 上有哪些适合新手跟进的优质项目?(附地址)
  2. Yann LeCun:假如没有深度学习,Facebook就是尘埃
  3. 利用Spring-Boot解析Excel、用Java分析Excel、告别手动输入用程序读取Excel
  4. 关于缓存雪崩\穿透\击穿等一些问题
  5. 第六十五期:IBM净利润下降38%,旧时代巨头如何自救?
  6. 大数据架构师指南 pdf_ZTE十年大数据架构师教你:高效搭建企业IT系统架构,超越CTO...
  7. day20——安装客户端、数据库连接、mysql事务、mysql操作数据
  8. Ubuntu下LDAP 部署文档
  9. TechNet Plus订阅版再度推出6折优惠
  10. 圆钢孔型计算机模拟,第五章 金属塑性加工ppt课件.ppt
  11. spyder python调试查看类信息_Python调试工具-Spyder
  12. Verilog 练习 7段数码管译码器
  13. 用C语言画一个Q版奥特曼
  14. SSL常见错误及解决方法
  15. 用户需求调研—快速上手篇
  16. ArcBlock冒志鸿 |“联网+DID”区块链应用破局的关键
  17. java画板中画直线_java实现画图板上画一条直线
  18. ERROR 1819 (HY000) Your password does not satisfy the current policy requirements
  19. linux uname命令的使用
  20. Oracle时间与Unix时间戳的转换

热门文章

  1. 翻译:SQL Server中的索引内部结构:到SQL Server索引级别10的阶梯。
  2. java 23种设计模式 深入理解
  3. 【网络流】网络流小总结
  4. python下各种包的安装
  5. Javascript弹出对话框 确定取消转到不同页面
  6. 牛客网(剑指offer) 第二十五题 复杂链表的复制
  7. PowerShell使用
  8. XSSFORK:新一代XSS自动扫描测试工具(精)
  9. Git之深入解析本地仓库的基本操作·仓库的获取更新和提交历史的查看撤销以及标签别名的使用
  10. 2018/Province_Java_A/2/星期一