codevs3160 最长公共子串

news/2025/1/11 21:05:28/

传送门:http://codevs.cn/problem/3160/

【题解】

CTSC前复习模板

sa的模板。。记住基数排序就够了(还有height)

还有就是sa[i]表示排名为i的后缀是啥。。rnk[i]表示suf(i)排第几

至于其他。。看造化了

大多数关于两个串的都要把它们接起来,然后上SA。

(两个串瞎jb匹配明明还可以FFT嘛)

那么这题。。按套路就是这么走的

可是怎么计算贡献呢

我们发现这样一个事情:

如果suf(sa[i]),suf(sa[j])有公共部分,那么一定不比suf(sa[i],suf(sa[j+1])劣。

我们按照后缀排序后,如果sa[i],sa[i+1]一个处于前半(s1),一个处于后半(s2),那么就是一个合法的匹配,更新答案。

另:还是不会SAM

# include <stdio.h>
# include <string.h>
# include <algorithm>
// # include <bits/stdc++.h>using namespace std;typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 2e5 + 10;
const int mod = 1e9+7;# define RG register
# define ST staticchar s1[M], s2[M]; 
char str[M]; 
int n, len1, len2; namespace SA {// rnk[i]: i后缀排名多少;sa[i]: 排名为i的后缀是哪个 int rnk[M], sa[M], h[M], tsa[M], A[M], B[M];int cntA[M], cntB[M]; inline void set() {memset(cntA, 0, sizeof cntA); for (int i=1; i<=n; ++i) ++cntA[str[i]]; for (int i=1; i<=255; ++i) cntA[i] += cntA[i-1];for (int i=n; i; --i) sa[cntA[str[i]] --] = i;rnk[sa[1]] = 1; for (int i=2; i<=n; ++i) { rnk[sa[i]] = rnk[sa[i-1]];if(str[sa[i]] != str[sa[i-1]]) ++rnk[sa[i]]; }for (int len=1; rnk[sa[n]] < n; len<<=1) {memset(cntA, 0, sizeof cntA);memset(cntB, 0, sizeof cntB); for (int i=1; i<=n; ++i) {cntA[A[i] = rnk[i]] ++;cntB[B[i] = ((i + len <= n) ? rnk[i+len] : 0)] ++;}for (int i=1; i<=n; ++i) cntA[i] += cntA[i-1], cntB[i] += cntB[i-1];for (int i=n; i; --i) tsa[cntB[B[i]] --] = i;for (int i=n; i; --i) sa[cntA[A[tsa[i]]] --] = tsa[i]; rnk[sa[1]] = 1; for (int i=2; i<=n; ++i) { rnk[sa[i]] = rnk[sa[i-1]];if(A[sa[i]] != A[sa[i-1]] || B[sa[i]] != B[sa[i-1]]) ++rnk[sa[i]]; }        }for (int i=1, j=0; i<=n; ++i) {if(j) --j;while(str[i+j] == str[sa[rnk[i]-1]+j]) ++j;h[rnk[i]] = j;}}
}int main() {scanf("%s", s1); len1 = strlen(s1); for (int i=0; i<len1; ++i) str[++n] = s1[i];str[++n] = 233;scanf("%s", s2);len2 = strlen(s2);for (int i=0; i<len2; ++i) str[++n] = s2[i]; SA::set(); int bet = len1 + 1, ans = 0;for (int i=1; i<n; ++i) {if((SA::sa[i] < bet && SA::sa[i+1] > bet) || (SA::sa[i] > bet && SA::sa[i+1] < bet))ans = max(ans, SA::h[i+1]);}printf("%d\n", ans); return 0;
}
View Code

 

转载于:https://www.cnblogs.com/galaxies/p/codevs3160.html


http://www.ppmy.cn/news/220777.html

相关文章

工控机进入u盘启动安装ubuntu、win10双系统

工控机安装双系统 安装参考教程:https://www.cnblogs.com/masbay/p/11627727.html 安装win10 由于之前的系统启动是属于传统MBR模式&#xff0c;所以重装windows系统来更新BIOS模式到UEFI 工控机中是双硬盘&#xff0c;分别是256G的lexar固态硬盘和2T的机械硬盘 做好win10的…

HDU3160 Rooks

题目链接&#xff1a;http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id17335 题意&#xff1a; 给定一个棋盘&#xff0c;棋盘上有一些必须要覆盖的点。现在可以放一个车&#xff0c;车可以消掉同行和同列上的点。 思路&#xff1a;看题解做的。假定选定某些行…

pve安装黑群晖直通硬盘_PVE系列二:安装黑群晖DSM系统

摘要: PVE上安装黑群晖DSM系统 群晖介绍:群晖是私有云服务器,提供诸如文件备份、多媒体库、数据管理中心等功能,其它很多功能都已经在本站有详细介绍,本文将介绍将群晖安装在虚拟... PVE上安装黑群晖DSM系统 群晖介绍:群晖是私有云服务器,提供诸如文件备份、多媒体库、数…

Intel超低功耗CPU的一些信息

2015年底: Intel Braswell是专门针对超低功耗移动和桌面平台的一个家族,现有赛扬N3000/N3050/N3150、奔腾N3700四款型号,其中N300的热设计功耗只有区区4W,其他三款均为6W,N3150则是迷你机、瘦客户端等设备的最爱,已经有大量产品问世。 Intel今天发出通知,称将对Braswell…

j3455linux网卡不亮,最新J3455主板直接安装黑群晖的若干问题解决办法

为了解决数据的存储问题&#xff0c;决定自己搭建黑群晖系统。在对比了自己组装和买成品NAS的价格后&#xff0c;觉得万由J3455主板的HOME NAS性价比很高&#xff0c;非常适合搭建家庭的数据存储&#xff0c;而且机箱材质很好、噪音小、功耗低&#xff0c;走线也非常规范。类似…

codevs 3160

SA入门题&#xff0c;将2个串中间用另外的字符链接即可 调了半天一直以为是模板的错&#xff0c;原来是乘法超了intQAQ 不好意思。。传错代码&#xff0c;误认子弟&#xff08;啪啪啪 1 #include<bits/stdc.h>2 #define inc(i,l,r) for(int il;i<r;i)3 #define dec(i,…

bzoj3160

题意&#xff1a;给定一个字符串&#xff0c;求出所有不连续的回文子序列&#xff0c;并且该子序列在原串的位置关于某位置对称。 先忽略掉不连续这个条件&#xff0c;先求出所有的然后减去连续的。 连续的就是回文子串 用Manacher算法可以O(n)求解&#xff0c;&#xff08;注…

Proxmox VE(PVE)、软路由、黑群晖(NAS)成功之道

为什么要安装黑群晖&#xff08;NAS&#xff09;&#xff1f; 随着网络的发展&#xff0c;数据量也不断增大&#xff0c;家庭NAS会是生活中必不可少的一部分。360云盘事件&#xff0c;告诉我们网络云盘的不安全性。白群晖价格昂贵&#xff0c;而且安装黑群晖更加灵活&#xff…