PAT (Top Level) Practice1005 Programming Pattern (35 分)
题目链接:https://pintia.cn/problem-sets/994805148990160896/problems/994805154748940288
用后缀数组求出长度为n所有子字符串的大小关系,然后得出重复最多的。
算法:后缀数组
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
#define maxn 1100000
using namespace std;
int n;
int sa[maxn], ranks[maxn];
int height[maxn];
int t1[maxn], t2[maxn];
int c[maxn];
string s;
int m;
bool cmp(int *r, int a, int b, int l) {return r[a] == r[b] && r[a + l] == r[b + l];
}
void da(int t) {int p;m = s.length();int *x = t1, *y = t2;for (int i = 0; i < t; i++) {c[i] = 0;}for (int i = 0; i < m; i++) {c[x[i] = s[i]]++;}for (int i = 1; i < t; i++) {c[i] += c[i - 1];}for (int i = m - 1; i >= 0; i--) {sa[--c[x[i]]] = i;}for (int k = 1; k <= m;) {p = 0;for (int i = m - k; i < m; i++) {y[p++] = i;}for (int i = 0; i < m; i++) {if (sa[i] >= k) {y[p++] = sa[i] - k;}}for (int i = 0; i < t; i++) {c[i] = 0;}for (int i = 0; i < m; i++) {c[x[y[i]]]++;}for (int i = 1; i < t; i++) {c[i] += c[i - 1];}for (int i = m - 1; i >= 0; i--)sa[--c[x[y[i]]]] = y[i];swap(x, y);p = 1;x[sa[0]] = 0;for (int i = 1; i < m; i++) {x[sa[i]] = cmp(y, sa[i - 1], sa[i], k) ? p - 1 : p++;}if (p >= m)break;t = p;k = k << 1;if (k >= n){for (int i = 0; i < m; i++) {ranks[sa[i]] = i;}break;}}
}
void getheight() {int k = 0;for (int i = 0; i < m; height[ranks[i++]] = k) {if (k)--k;if (ranks[i] == 0) {height[ranks[i]] = 0;continue;}for (int j = sa[ranks[i] - 1]; s[i + k] == s[j + k];) {k++;if (k >= n) {k = n; break; }}}
}
int main() {cin >> n;cin.get();getline(cin, s);da(128);getheight();int h = sa[0], _h = -1;int ans = 1, ans1 = 1;for (int i = 1; i < m; i++) {if (height[i] >= n) {ans++;}else {if (ans > ans1||(_h==-1)||(ans==ans1&&s[h]<s[_h])) {ans1 = ans;_h = h;}ans = 1, h = sa[i];}}if (ans > ans1 || (ans == ans1 && s[h] < s[_h])) {ans1 = ans; _h = h;}cout << s.substr(_h, n) << " " << ans1 << endl;return 0;
}
PAT (Top Level) Practice1005 Programming Pattern (35 分)相关推荐
- PAT (Top Level) Practise 1008 Airline Routes(Tarjan模版题)
1008. Airline Routes (35) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue Given a ...
- PAT顶级 1003 Universal Travel Sites (35分)(最大流)
题目链接: 1003 Universal Travel Sites (35分) 思路: 题目问stationstationstation的最小容量,变相就是问最多能一次性出发多少人,使得过程中不会超过 ...
- PAT (Basic Level) Practice1005 继续(3n+1)猜想
1005 继续(3n+1)猜想 一.题目 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇 ...
- PAT顶级 1016 Uniqueness of MST (35分)(判断最小生成树是否唯一)
添加链接描述 Given any weighted undirected graph, there exists at least one minimum spanning tree (MST) if ...
- PAT (Advanced Level) Practice 1166 Summit (25 分)
题目 因为只是判断是否是直接相连,所以觉得直接用暴力模拟,而且数据范围也很小.果然,许久不练题,A题的效率都下降了.不过,练题真的是打发时间的好途径. #include <bits/stdc++ ...
- PAT (Advanced Level) Practice 1043 Is It a Binary Search Tree (25 分) 凌宸1642
PAT (Advanced Level) Practice 1043 Is It a Binary Search Tree (25 分) 凌宸1642 题目描述: A Binary Search Tr ...
- 1001 害死人不偿命的(3n+1)猜想 (15分) PAT (Basic Level) Practice (中文)C语言版
PAT (Basic Level) Practice (中文) 1001 害死人不偿命的(3n+1)猜想 (15分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一 ...
- PAT (Advanced Level) Practice 1011 World Cup Betting (20 分) 凌宸1642
PAT (Advanced Level) Practice 1011 World Cup Betting (20 分) 凌宸1642 题目描述: With the 2010 FIFA World Cu ...
- PAT (Basic Level) Practice (中文)1095 解码PAT准考证 (25 分)
PAT (Basic Level) Practice (中文)1095 解码PAT准考证 (25 分) PAT 准考证号由 4 部分组成: 第 1 位是级别,即T代表顶级:A代表甲级:B代表乙级: 第 ...
最新文章
- Intellij IDEA 将工程转换成maven工程 详解
- JAVA语言教学重点_《JAVA语言》教学大纲
- 字符串转为小数点,乘以一个数以后,转换为科学计数法,再把科学计数法转化为字符串
- Java 小故事系列 导航
- import cv2找不到模块的解决方法
- GitHub之GitHub Actions的项目自动化持续集成和部署
- 使用vue-seamless-scroll自动滚动插件复制出来的数据点击事件无效的解决办法
- 要闻君说:facebook迎来“全球宕机”惊险时刻;吸引大牛!拼多多成立了技术委员会;胡晓明卸任庚接任,阿里云计算迎来法人变更...
- 计算机电缆检测报告,天联牌计算机电缆详细介绍
- 计算机中用于表示储存,计算机中用来表示存储器容量的基本单位是
- javafx实现简单的计时器
- java oop 题目_JavaOOP试题JavaOOP试题.doc
- PPASR流式与非流式语音识别
- Paython基础讲解(1)
- 中选择语句如何并列_如何做好诗歌鉴赏中的选择题
- 请你谈谈TCP协议与UDP协议的区别
- URL缩短器:详细说明
- 实例检索︱图像的实例搜索(文献、方法描述、商业案例)
- Linux ls 命令学习和简单使用
- Android 手机上安装并运行 Ubuntu 12.04