计蒜客 抄袭检测 (最长公共子串)
#include<stdio.h>
#include<algorithm>
#include<cstring>
#include<iostream>const int MAXN = 2e5+10;
int r[MAXN]; // r 数组保存了字符串中的每个元素值,除最后一个元素外,每个元素的值在 1..m 之间,最后一个元素的值为 0
int wa[MAXN], wb[MAXN], wv[MAXN], ws[MAXN]; // 这 4 个数组是后缀数组计算时的临时变量,无实际意义
int sa[MAXN]; // sa[i] 保存第 i 小的后缀在字符串中的开始下标,i 取值范围为 0..n-1
int cmp(int *r, int a, int b, int l) {return r[a] == r[b] && r[a + l] == r[b + l];
}
void da(int *r, int *sa, int n, int m) { // n 为字符串的长度,m 为字符最大值int i, j, p, *x = wa, *y = wb;for (i = 0; i < m; ++i) ws[i] = 0;for (i = 0; i < n; ++i) ws[x[i] = r[i]]++;for (i = 1; i < m; ++i) ws[i] += ws[i - 1];for (i = n - 1; i >= 0; --i) sa[--ws[x[i]]] = i;for (j = 1, p = 1; p < n; j *= 2, m = p) {for (p = 0, i = n - j; i < n; ++i) y[p++] = i;for (i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;for (i = 0; i < n; ++i) wv[i] = x[y[i]];for (i = 0; i < m; ++i) ws[i] = 0;for (i = 0; i < n; ++i) ws[wv[i]]++;for (i = 1; i < m; ++i) ws[i] += ws[i - 1];for (i = n - 1; i >= 0; --i) sa[--ws[wv[i]]] = y[i];for (std::swap(x, y), p = 1, x[sa[0]] = 0, i = 1; i < n; ++i)x[sa[i]] = cmp(y, sa[i - 1], sa[i], j) ? p - 1 : p++;}return;
}int rank[MAXN]; // rank[i] 表示从下标 i 开始的后缀的排名,值为 1..n
int height[MAXN]; // 下标范围为 1..n,height[1] = 0
void calHeight(int *r, int *sa, int n) {int i, j, k = 0;for (i = 1; i <= n; ++i)rank[sa[i]] = i;for (i = 0; i < n; height[rank[i++]] = k)for (k ? k-- : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; ++k);return;
}char str[MAXN];
char str2[MAXN];int main(){scanf("%s%s",str,str2);int len1=strlen(str);int len2=strlen(str2);str[len1]='$';str[len1+1]='\0';strcat(str,str2);int n=len1+len2+1;for(int i=0;i<=n;i++){r[i]=str[i];}//printf("%s",str);da(r,sa,n+1,128);calHeight(r,sa,n);int ans=0;for(int i=1;i<=n;i++){if((sa[i]<len1)!=(sa[i-1]<len1)){ans=std::max(ans,height[i]);}}printf("%d\n",ans);return 0;
}
计蒜客 抄袭检测 (最长公共子串)相关推荐
- 牛客题霸 [最长公共子串]C++题解/答案
牛客题霸 [最长公共子串]C++题解/答案 题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1 题解: lcs模板 代码: class Solut ...
- [计蒜客][字符串]最长的名字
题目来源 计蒜客程序设计竞赛基础课(蓝桥杯省赛) 算法标签 字符串 题目描述 思路 更新最长 把字符串都放数组里,看谁长度和最大值一致就拿出来 AC代码 #include<iostream> ...
- 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...
在人才招聘领域存在这样一个怪圈,高校每年都说是最难就业年.人才过剩,而对于企业HR来说永远都招不到称心如意的人才.这个怪圈在"计蒜客"创始人俞昊然看来,主要是因为当今高校的教学资源 ...
- 计蒜客 T1853:非常男女(前缀和)
上一篇博客计蒜客 T1101:大整数的因子(高精度除法详解) 写在前面:大家好!我是ACfun,我的昵称来自两个单词Accepted和fun.我是一个热爱ACM的蒟蒻.这篇博客来记录一下计蒜客T18 ...
- 计蒜客题解——T1214:鸣人和佐助
题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1214. 题目描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到 ...
- 计蒜客题解——T1213:拯救行动
题目相关 题目链接 计蒜客 OJ,https://nanti.jisuanke.com/t/T1213. 题目描述 公主被恶人抓走,被关押在牢房的某个地方.牢房用 N×M(N,M≤200) 的矩阵来表 ...
- 计蒜客题解——T1769:最大岛屿
题目相关 题目链接 计蒜客,https://nanti.jisuanke.com/t/T1405. 我的OJ,http://47.110.135.197/problem.php?id=5254. 题目 ...
- 计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析
新手,欢迎交流,剩下D题不知如何下手,望大佬指教. 计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析 文章目录 A. 结果填空:计算周长 B. 结果填空:七巧板 C. 结果填空:苹果 ...
- 计蒜客 T1895切蛋糕(单调队列)
题目:传送阵 思路: 分析题目,简单的说这个题目求的就是最大不定长子段和,那么首先对于最大不定长子段和,我们肯定要首先预处理前缀和数组,然后首先朴素的想, 对于以第i个元素结尾的子段,最大的子段和re ...
最新文章
- three.js(六) 地形法向量生成
- jstl 获取 javascript 定义的变量_一个后端开发者前端语言基础:JavaScript
- 编程方法课程学习心得
- iOS使用AVCaptureSession自定义相机
- 第4章-无人车UGV模型分析
- 50个不上你网站的理由
- 工艺仿真软件_中科院科研项目:算法与软件工程集成电路制造中的工艺仿真
- 《算法图解》——二分查找
- Git最基本入门,只是个感想总结啊啊啊不要搜到我0.0
- java不显示图片_java图片显示不出来应该如何解决
- 卡方检验结果表格中出现非常多个卡方值和P值的原理和实现步骤
- php设置pdf下载加密文件,怎么解除pdf加密 被加密的pdf文件
- 如何在google隐藏页面_如何在Google文档中隐藏或删除评论
- 使用Incapsula免费CDN加速godaddy空间
- 关于Oracle SQL中系统时间和库里数据时间的比较
- js 里奇数的判断条件
- Kafka中zookeeper的作用详解(7点)
- 单位计算机网络管理员论文,计算机专业毕业论文(计算机网络管理软件的研究)教案.doc...
- CEP的一个简单理解
- [立创传智黑马程序员CSDN]训练营——仿生机械狗
热门文章
- 书籍集锦——关于深度学习
- JavaEE-网络编程
- python turtle画熊猫人_使用Python的turtle画小猪乔治
- php获取访问者qq,利用iframe技巧获取访问者qq
- erwin Data Modeler 如何连接 Oracle
- IDEA Java项目Web页面的中文乱码解决方案
- idea项目使用tomcat运行乱码问题(全部解决,亲测有效)
- linux磁盘分区fdisk命令详解及云硬盘挂载实操
- springmvc web网站开发上传视频到远程服务器解决方案
- php淘宝接口API查询手机号归属地 __GetZoneResult_