首页 > 其他分享 >YC342A [ 20240922 CQYC NOIP 模拟赛 T1 ] 前缀(lcp)

YC342A [ 20240922 CQYC NOIP 模拟赛 T1 ] 前缀(lcp)

时间:2024-10-02 09:22:17浏览次数:1  
标签:YC342A 10 NOIP lcp int 贡献 array include 前缀

题意

给定 \(n, m\) 以及长为 \(n\) 的字符串 \(S\)。

你需要构造字符串 \(T\) 使得 \(\sum LCP(S, T[i, ..., m])\) 最大。

求出这个最大值。

\(n, m \le 5 \times 10 ^ 3\)。

Sol

首先不难发现答案一定可以由若干 \(S\) 的前缀拼成。考虑找到最小的无法被拆为前缀的子段,显然这个子段无法产生任何贡献。

考虑一个 \(\texttt{dp}\),设 \(f_{i, j}\) 表示当前放了前 \(i\) 个位置,放到 \(S\) 的前缀 \(j\),的答案。

但是这个东西有一个问题,会算漏很多贡献,因为前一个前缀对后面的前缀都是有贡献的。

因此考虑 \(border\),不难发现事实上添加一个点的贡献就是她的最大 \(border\) 的贡献 $ + 1$。

  • \(f_{i, j} \leftarrow f_{i - 1, j - 1} + cnt_{j}\)。
  • \(f_{i, nxt_j} \leftarrow f_{i, j}\)。

做完了,时间复杂度:\(O(n \times m)\)。

Code

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
using namespace std;
#ifdef ONLINE_JUDGE

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
    int p = 0, flg = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') flg = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        p = p * 10 + c - '0';
        c = getchar();
    }
    return p * flg;
}
void write(int x) {
    if (x < 0) {
        x = -x;
        putchar('-');
    }
    if (x > 9) {
        write(x / 10);
    }
    putchar(x % 10 + '0');
}
bool _stmer;

const int N = 5e3 + 5;

array <int, N> s;

namespace Kmp {

array <int, N> isl;

void prefix(int n) {
    for (int i = 2; i <= n; i++) {
        isl[i] = isl[i - 1];
        while (isl[i] && s[i] != s[isl[i] + 1]) isl[i] = isl[isl[i]];
        if (s[i] == s[isl[i] + 1]) isl[i]++;
    }
}

} //namespace Kmp

array <array <int, N>, N> f;
array <int, N> cnt;

bool _edmer;
int main() {
    cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";
    int n = read(), m = read();
    for (int i = 1; i <= n; i++) s[i] = read();
    Kmp::prefix(n);
    for (int i = 1; i <= n; i++)
        cnt[i] = cnt[Kmp::isl[i]] + 1;
    f[0].fill(-2e9), f[0][0] = 0;
    for (int i = 1; i <= m; i++) {
        f[i].fill(-2e9);
        for (int j = n; j; j--) {
            f[i][j] = max(f[i][j], f[i - 1][j - 1] + cnt[j]);
            f[i][Kmp::isl[j]] = max(f[i][Kmp::isl[j]], f[i][j]);
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; i++) ans = max(ans, f[m][i]);
    write(ans), puts("");
    return 0;
}

标签:YC342A,10,NOIP,lcp,int,贡献,array,include,前缀
From: https://www.cnblogs.com/cxqghzj/p/18444428

相关文章

  • A. 2025--[炼石计划--NOIP模拟三]--T1--矩形
    赛时草了个\(O(n^4\log(n))\)竟然能过70分虽然本来就是这么分配的,发现正解只需将二分改为双指针就可以了,最气的是上面计算的时候用到还是尺取下面就用的二分(唐诗)。其实这题就是暴力,然后在低级的暴力上加一些操作变得稍微高级一点。计算的话直接暴力查找不同颜色,只不过范围......
  • 南沙C++信奥赛陈老师解一本通题: 1963:【13NOIP普及组】小朋友的数字
    ​ 【题目描述】有 nn 个小朋友排成一列。每个小朋友手上都有一个数字,这个数字可正可负。规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值。作为这些小朋友的老师,你需要给每个小朋友一个分数,分数是这样规定的:......
  • 【2024.9.30】NOIP2024 赛前集训-刷题训练(4)
    【2024.9.30】NOIP2024赛前集训-刷题训练(4)Problem-2000D-Codeforces给一串数和一串LR字符,L可以向右连接R,覆盖部分的LR不能再使用,但覆盖部分可以有被禁用的LR。每次覆盖部分的数字之和计入答案,求最大答案。手玩一下发现可以贪心。从最左边的L和最右边的R开始贪心。......
  • (洛谷)题目题号P1047 [NOIP2005 普及组] 校门外的树
    Hello大家好我是小亦,这是今天发布的第二篇题解,唉我就在想怎么样才能把粉丝提上来呢隔壁朋友都比我高了好多唉苦恼qwq,好吧接受现实,好那么好今天我们来讲的是来自于NOIP2005年普及组的真题名叫:校门外的树,其实这道题跟其他几道题很相似,应该是同一家的吧qwq,好了不废话了思路给大家q......
  • 南沙C++信奥赛陈老师解一本通题1965:【14NOIP普及组】珠心算测验
    ​ 【题目描述】珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不......
  • 梦熊 NOIP 13连测 #3
    A.赛事找规律找到了,可惜差一步,然后用了oies。欧拉定理:若\(gcd(a,m)=1\),则\(a^{\phi(m)}\equiv1(mod\m)\)。发现1和\(2n\)永远都不会动,并且当2归位时,整套牌也都归位了,所以先只考虑2的位置变化。如果\(n\)无线大,第\(i\)次操作后2的位置为\(2^i+1......
  • 南沙C++信奥赛陈老师解一本通题:1945:【09NOIP普及组】多项式输出
    ​ 【题目描述】一元 nn 次多项式可用如下的表达式表示: f(x)=anxn+an−1xn−1+...+a1x+a0,an≠0f(x)=anxn+an−1xn−1+...+a1x+a0,an≠0 其中,aixii 称为i次项,ai称为ii次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:1.多项式中......
  • 【题解】【模拟,字符串】—— [NOIP2011 普及组] 统计单词数
    【题解】【字符串】——[NOIP2011普及组]统计单词数[NOIP2011普及组]统计单词数题目描述输入格式输出格式输入输出样例输入#1输出#1输入#2输出#2提示1.思路解析2.AC代码[NOIP2011普及组]统计单词数通往洛谷的传送门题目描述一般的文本编辑器都有查找......
  • 2024 Noip 做题记录(三)
    \(\text{ByDaiRuiChen007}\)Round#9-2024.9.23A.[P10849]LevelProblemLink题目大意给定若干人和空位,等级\(1\simn\),其中等级为\(i\)的人和空位分别有\(b_i,a_i\)个,给每个人匹配一个位置,如果一个等级为\(i\)的人匹配了一个等级为\(j\)的位置,会产生\(\ma......
  • 南沙C++信奥赛陈老师解一本通题 1922:【03NOIP普及组】乒乓球
    ​ 【题目描述】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不......