51nod 1292 字符串中的最大值 V2 (后缀数组)

简介: 51nod 1292 字符串中的最大值 V2 (后缀数组)

有一个字符串T。字符串S的F函数值可以如下计算:F(S) = L * S在T中出现的次数(L为字符串S的长度)。求所有T的子串S中,函数F(S)的最大值。

输入

输入字符串T, (1 <= L <= 1000000, L为T的长度),T中的所有字符均为小写英文字母。

输出

输出T的所有子串中长度与出现次数的乘积的最大值。

输入样例

aaaaaa

输出样例

12

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int sa[maxn], rak[maxn];
int tx[maxn], height[maxn];
char s[maxn];
int n, m, p;
int cnt[maxn];
struct node {
  int x, y, id;
}a[maxn], b[maxn];
void rsort() {
  for (int i = 1; i <= m; i++) tx[i] = 0;
  for (int i = 1; i <= n; i++) tx[a[i].y]++;
  for (int i = 1; i <= m; i++) tx[i] += tx[i - 1];
  for (int i = 1; i <= n; i++) b[tx[a[i].y]--] = a[i];
  for (int i = 1; i <= m; i++) tx[i] = 0;
  for (int i = 1; i <= n; i++) tx[b[i].x]++;
  for (int i = 1; i <= m; i++) tx[i] += tx[i - 1];
  for (int i = n; i >= 1; i--) a[tx[b[i].x]--] = b[i];
}
void ssort() {
  rsort();
  p = 0;
  for (int i = 1; i <= n; i++) {
    if (a[i].x != a[i - 1].x || a[i].y != a[i - 1].y) ++p;
    rak[a[i].id] = p;
  }
  for (int i = 1; i <= n; i++) {
    a[i].x = rak[i];
    a[i].id = sa[rak[i]] = i;
    a[i].y = 0;
  }
  m = p;
}
void solve() {
  m = 127;
  for (int i = 1; i <= n; i++) {
    a[i].x = a[i].y = s[i];
    a[i].id = i;
  }
  ssort();
  for (int j = 1; j <= n; j <<= 1) {
    for (int i = 1; i + j <= n; i++) {
      a[i].y = a[i + j].x;
    }
    ssort();
    if (p == n) break;
  }
}
void get_Height() {
  int k = 0;
  for (int i = 1; i <= n; i++) {
    if (k) k--;
    int j = sa[rak[i] - 1];
    while (i + k <= n && j + k <= n && s[i + k] == s[j + k]) k++;
    height[rak[i]] = k;
  }
}
int main() {
  scanf("%s", s + 1);
  n = strlen(s + 1);
  solve(); get_Height(); 
  int mm = 1e8;
  for (int i = rak[1] + 1; i <= n; i++) {
    mm = min(mm, height[i]);
    cnt[mm]++;
  }
  mm = 1e8;
  for (int i = rak[1]; i >= 1; i--) {
    mm = min(mm, height[i]);
    cnt[mm]++;
  }
  for (int i = n; i >= 1; i--) {
    cnt[i] += cnt[i + 1];
  }
  long long ans = 0;
  for (int i = 1; i <= n; i++) {
    ans = max(ans, 1LL * i * (cnt[i] + 1));
  }
  printf("%lld\n", ans);
  return 0;
}
目录
打赏
0
0
0
0
0
分享
相关文章
使用多线程或异步技术提高图片抓取效率
图片抓取是爬虫技术中常见的需求,但是图片抓取的效率受到很多因素的影响,比如网速、网站反爬机制、图片数量和大小等。本文将介绍如何使用多线程或异步技术来提高图片抓取的效率,以及如何使用爬虫代理IP来避免被网站拒绝服务
262 0
使用多线程或异步技术提高图片抓取效率
一条神奇的贝塞尔曲线及其应用(上)
今天的主题,就是主要和大家介绍贝塞尔曲线!
322 0
一条神奇的贝塞尔曲线及其应用(上)
kde
|
14天前
|
Docker镜像加速指南:手把手教你配置国内镜像源
配置国内镜像源可大幅提升 Docker 拉取速度,解决访问 Docker Hub 缓慢问题。本文详解 Linux、Docker Desktop 配置方法,并提供测速对比与常见问题解答,附最新可用镜像源列表,助力高效开发部署。
kde
9092 53
|
11天前
typora免费版,激活方法,Typora使用教程
Typora是一款简洁高效的Markdown编辑器,支持即时渲染。本教程涵盖安装方法、文件操作、视图控制、格式排版、字体样式及Markdown语法,助你快速上手使用Typora进行高效写作。
2370 4
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问