ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

$\%$ 您 赛 $11$

2022-07-25 19:00:09  阅读:142  来源: 互联网

标签:11 前缀 测试点 基因 哈希 序列 翻转


\(\text{Date: 7.25}\)

\(\%\) 您 赛 \(11\)

写挂了写挂了写挂了写挂了写挂了写挂了

\(\to\text{Link}\leftarrow\)

\(T1\) 忘特判(\(-40pts\)),\(T2\) 爆内存(\(-100pts\)),\(T3\) 写复杂, \(T4\) 欠智商还忘去掉\(clock()\)了。

\(\Huge \tt你已经菜成这样了\)

\(\Huge \tt还颓废呢\)

\(\Huge \tt gun去写题\)

\(T1T2\) 略,单调队列应该是会写的?

\(T3\) 略,前缀和居然不是第一时间想到的,智商欠费

\(Manacher\) 不要再忘了。

inline void manacher() {
    t[0] = '!'; t[cnt = 1] = '#';
    for(rg int i = 1; i <= n; ++i) {
        t[++cnt] = s[i];
        t[++cnt] = '#';
    }
    rg int mid = 0, r = 0;
    for(rg int i = 1; i <= cnt; ++i) { // 马拉车
        if(i <= r) p[i] = min(r - i + 1, p[(mid << 1) - i]);
        while(t[i - p[i]] == t[i + p[i]]) ++p[i];
        if(i + p[i] >= r) r = p[i] + i - 1, mid = i;
    }
    for(rg int i = 1; i <= cnt; ++i) --p[i]; // p[i] - 1 才是以一个回文中心(包括偶数的回文串)能拓展的最长回文串长度

    //for(int i = 1; i <= cnt; ++i) printf("p[%d] = %d\n", i, p[i]);

    for(rg int i = 1; i <= cnt; ++i) 
        for(rg int j = 1; j <= p[i]; j += 2) {
            //printf("[%d, %d]\n", (i - j + 1) >> 1, (i + j) >> 1);
            //update((i - j + 1) >> 1, (i + j) >> 1);
            ++res[(i - j + 1) >> 1][(i + j) >> 1];
        }
            //++res[(i - j) >> 1][(i + j) >> 1];
    for(rg int i = 1; i <= n; ++i) {
        for(rg int j = 1; j <= n; ++j) {
            res[i][j] += res[i][j - 1] + res[i - 1][j] - res[i - 1][j - 1];
        }
    }
}

\(T4\)

\(2xxx\) 年,一种基因修改技术在 \(Y\) 大陆流行;
为了简化问题,我们把基因看做一个长度为 \(N\) 的正整数序列;
人们可以对基因进行多次修改。具体来讲,对于每次修改可以表述为:选择
这个基因序列的一个前缀,然后翻转它们;但是这个技术有很多限制,首先,必
须先翻转长度小的前缀,再翻转长度大的前缀;其次,有一些长度的前缀是无法
被翻转的,这样的前缀一共有 \(M\) 个;
大部分人都认为,字典序越小的基因序列
越优越,越先进,所以它们想知道,在通过这个技术翻转基因序列后,所能得到
的最小字典序的序列是什么。

题解是这样说的:

测试点 \(1-2\),暴力枚举每个位置翻或不翻; \(O(2^N)\)
测试点 \(3-4\),我们现在想求出,对于前 \(i\) 个数,所能产生的最小的字典序
是多少; 我们发现,无论后面的怎么翻,之前的一定是越小越好; 对于相邻两
个能翻的位置 \(i, j\),\((i < j)\)。前 \(j\) 个的最小值要么是前 \(i\) 个的最小值接上 \(i\)
到 \(j\) 这一段;要么是 \(i\) 到 \(j\) 的翻转接上前 \(i\) 个的最小值(同时在 \(i\) 和 \(j\) 翻
转); 每次翻转前判断哪种方式更优,\(O(N)\) 暴力比较;
测试点 \(5-6\),考虑用哈希 + 二分的方式判断优劣程度; 我们现在要维护这
些操作:尾部插入,头部插入,维护一段的哈希值;一个朴素的实现就是线段树;
\(O(N \log^2 N)\)
测试点 \(7-10\),其实根本不需要用数据结构维护;直接用两个队列,记录头
插入和尾插入的数; 维护队列的前缀哈希值和后缀哈希值;用这些一定可以拼
出一段的哈希值;\(O(N \log N)\)

然而并不是很懂。

赛时应该是想到了部分正解的思路的,但是非常地不确定,不敢在思路非常模糊的状态下去搞一个未知的模拟。

主题思路大概想到了,但是就是脑抽

就是下饭

还有这个OJ是再也忍不下去了。。。什么lj的OJ。。。

标签:11,前缀,测试点,基因,哈希,序列,翻转
来源: https://www.cnblogs.com/Doge297778/p/16518448.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有