HDU-1403-Longest Common Substring(后缀数组的高度数组运用)
这题要求两个串中的最长相同子串的长度。高度数组可以求一个串中的最长相同子串的长度。所以想到把两个串连起来,但是这样又会产生一些新的串(第一个串的结尾和第二个串的开头组成的)于是在两个串中间放一个'\0'分隔,正好'\0'是字符里最小的,不会对第一个串的排序产生影响。
Accepted | 1403 | 62MS | 5344K | 2117 B | G++ |
- #include "bits/stdc++.h"
- using namespace std;
- const int MAXN = 2e5 + ;
- char s[MAXN];
- int x[MAXN], y[MAXN], cnt[MAXN];
- int sa[MAXN], rk[MAXN], height[MAXN];
- int a, b, ans;
- void getSa(int n, int m) {
- for (int i = ; i <= m; i++) {
- cnt[i] = ;
- }
- for (int i = ; i <= n; i++) {
- cnt[x[i] = s[i]]++;
- }
- for (int i = ; i <= m; i++) {
- cnt[i] += cnt[i - ];
- }
- for (int i = n; i; i--) {
- sa[cnt[x[i]]--] = i;
- }
- int num = ;
- for (int j = ; num < n; j <<= , m = num) {
- num = ;
- for (int i = n - j + ; i <= n; i++) {
- y[++num] = i;
- }
- for (int i = ; i <= n; i++) {
- if (sa[i] > j) {
- y[++num] = sa[i] - j;
- }
- }
- for (int i = ; i <= m; i++) {
- cnt[i] = ;
- }
- for (int i = ; i <= n; i++) {
- cnt[x[i]]++;
- }
- for (int i = ; i <= m; i++) {
- cnt[i] += cnt[i - ];
- }
- for (int i = n; i; i--) {
- sa[cnt[x[y[i]]]--] = y[i];
- }
- swap(x, y);
- num = ;
- x[sa[]] = ;
- for (int i = ; i <= n; i++) {
- if (y[sa[i]] != y[sa[i - ]] || y[sa[i] + j] != y[sa[i - ] + j]) {
- x[sa[i]] = ++num;
- } else {
- x[sa[i]] = num;
- }
- }
- }
- }
- void getHeight(int n) {
- for (int i = ; i <= n; i++) {
- rk[sa[i]] = i;
- }
- int k = ;
- for (int i = ; i <= n; i++) {
- int j = sa[rk[i] - ];
- k = k ? k - : k;
- while (s[i + k] == s[j + k]) {
- k++;
- }
- // height[rk[i]] = k;
- // 如果i和j位于前后两个不同的串,更新ans
- if ((i <= a + ) ^ (j <= a + )) {
- ans = max(ans, k);
- }
- }
- }
- int main() {
- while (~scanf("%s", s + )) {
- a = strlen(s + );
- // 把第二个字符串直接输入到第一个字符串的'\0'后面,例如输入两个"abc"就是"\0abc\0abc\0"
- scanf("%s", s + a + );
- b = strlen(s + a + );
- // n表示第一个串的长度,m表示第二个串的长度,加上中间的'\0'要求后缀数组的部分长度为n + m + 1,也就是"abc\0abc"这部分
- getSa(a + b + , );
- ans = ;
- // 在求高度数组的时候为避免第二个串后面的'\0'和第一个串后面的'\0'对结果造成影响。"abc\0" == "abc\0" 将第二个串后面的'\0'改成字符串中不可能出现的字符
- s[a + b + ] = '';
- getHeight(a + b + );
- printf("%d\n", ans);
- }
- return ;
- }
HDU-1403-Longest Common Substring(后缀数组的高度数组运用)的更多相关文章
- hdu 1403 Longest Common Substring 后缀数组 模板题
题目链接 题意 问两个字符串的最长公共子串. 思路 加一个特殊字符然后拼接起来,求得后缀数组与\(height\)数组.扫描一遍即得答案,注意判断起始点是否分别在两个串内. Code #include ...
- hdu 1403 Longest Common Substring(最长公共子字符串)(后缀数组)
http://acm.hdu.edu.cn/showproblem.php?pid=1403 Longest Common Substring Time Limit: 8000/4000 MS (Ja ...
- HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)
Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...
- HDU - 1403 - Longest Common Substring
先上题目: Longest Common Substring Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- HDU 1403 Longest Common Substring(后缀数组,最长公共子串)
hdu题目 poj题目 参考了 罗穗骞的论文<后缀数组——处理字符串的有力工具> 题意:求两个序列的最长公共子串 思路:后缀数组经典题目之一(模版题) //后缀数组sa:将s的n个后缀从小 ...
- HDU 1403 Longest Common Substring(最长公共子串)
http://acm.hdu.edu.cn/showproblem.php?pid=1403 题意:给出两个字符串,求最长公共子串的长度. 思路: 刚开始学后缀数组,确实感觉很难,但是这东西很强大,所 ...
- POJ 2774 Long Long Message&&HDU 1403 Longest Common Substring&&COJ 1203
后缀数组的买1送2题... HDU的那题数据实在是太水了,后来才发现在COJ和POJ上都是WA..原因在一点:在建立sa数组的时候里面的n应该是字符串长度+1....不懂可以去看罗大神的论文... 就 ...
- spoj 1811 LCS - Longest Common Substring (后缀自己主动机)
spoj 1811 LCS - Longest Common Substring 题意: 给出两个串S, T, 求最长公共子串. 限制: |S|, |T| <= 1e5 思路: dp O(n^2 ...
- SPOJ1811 LCS - Longest Common Substring(后缀自动机)
A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...
- 【HDOJ】1403 Longest Common Substring
后缀数组2倍增可解. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXM 28 ...
随机推荐
- h5-携程页面小案例-伸缩盒子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python使用+和*操作符 连接2个列表和列表的复制
+ 操作符通常连接两个列表可以使用 +进行连接得到一个新列表 *操作符择可以用于一个列表和一个整数,实现列表的复制.
- 干货 | 玩转云文件存储——利用CFS实现web应用的共享访问
京东云文件服务(Cloud File Service,以下简称:CFS)是一种高可靠.可扩展.可共享访问的全托管分布式文件系统.它可在不中断应用服务的情况下,根据您对文件系统的使用,按需扩展或缩减,并 ...
- 干货 | CDN搭配OSS最佳实践 ——搭建动静态分离的应用架构
一.传统架构及痛点 传统的网站产品应用架构,所有资源部署在应用服务器本地存储或挂载的数据存储区,对于动静态资源不作分离, 产品架构如下图所示: 该架构存在诸多问题: ● 系统性能会随着系统访问量的增长 ...
- py02_02:pyc的解释
1. Python是一门解释型语言吗? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在.如果是解释型语言 ...
- JavaSE--数字签名之校验签名
参考:http://blog.csdn.net/dotuian/article/details/51722300 关于keystore的简单介绍 Keytool是一个Java数据证书的管理工具 ,Ke ...
- jenkins pipeline 之 deploy k8s 环境并发送邮件通知
项目中有更新代码之后触发jenkins任务,部署好之后并发送邮件给发开人员 #!/usr/bin/env groovy Date date = new Date()def time = date.fo ...
- 扯下Python的super()
注: Python 2.7.x 环境下 今晚搜东西无意中看到这篇Understanding Python super() with __init__() methods. 其实这篇老早就看过了, 不过 ...
- 11)PHP,单选框和复选框的post提交方式处理
就是一个表单中会有input的checkbox形式,那么怎么处理,就有了问题,一般采用二维数组来处理 代码展示: <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- Springboot中RestTemplate -- 用更优雅的方式发HTTP请求
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率. 我之前的HTTP开发是用ap ...