首页 > 其他分享 >NFLS NOI模拟 真夏は誰のモノ

NFLS NOI模拟 真夏は誰のモノ

时间:2024-05-11 23:08:06浏览次数:16  
标签:字符 NOI int NFLS 真夏 MAXN 操作 序列 长度

涉及知识点:DP

题面

有一个长度为 \(n\ (\leq 6000)\) 字符串 \(s\),可以执行如下操作:选定一个 \(i\in[1,n]\),将 \(i\) 左侧或者右侧的连续若干个字符变成 \(s[i]\)(选定的字符要连续且有一个与 \(i\) 相邻)。你可以执行任意次这样的操作,请问最后可以得到多少种本质不同的合法的字符串?定义一个字符串是合法的,当且仅当这个字符串不存在长度超过 \(k\) 的由同一种字符构成的子串。

思路

题面所述的操作可以进行无限次,并且后面的操作又可以覆盖前面操作的结果(比如说aaba \(\rightarrow\)aaab),总而言之,这么难以处理的操作提示着我们这道题不应该从操作本身出发,而应该去寻找操作之后的序列有什么性质,而经过思考后我们发现,由于操作的本质是从一个点进行拓展,即使有字符可能被完全覆写,但是剩下字符间的相对顺序是不变的,一个字符不可能在不完全覆写它旁边字符的情况下拓展到更远的地方,因此当我们把操作后的序列相邻的相同字符合并后,我们可以说合并后的序列一定是原序列的子序列。

现在问题就变得不那么棘手了一些,我们需要在原长为 \(n\) 的序列中找到所有长度为 \(m\) 的相邻字符不同的子序列,对于每个子序列,我们求出它可以“还原”成多少种操作后的序列,而这个数量并不难统计,用组合意义思考,实际上就是:将长度为 \(n\) 的序列划分为 \(m\) 个长度不超过 \(k\) 的子段的方案数。

现在目标很明确了,我们要干两件事,考虑 DP 转移:

  1. 求原序列有多少长度为 \(m\)​ 的相邻字符不同的子序列

    \(f[i][j]\) 表示长度为 \(i\),最后一个字符是 \(j\) 的方案数,\(s[i]\) 表示长度为 \(i\) 的子序列数

    \(f[i][j]=s[i-1]-f[i-1][j]\)

    \(s[i]=f[i][0]+f[i][1]+\cdots+f[i][MAXC]\)

  2. 求长度为 \(n\) 的序列划分为 \(m\) 个长度不超过 \(k\) 的子段的方案数

    \(f[i][j]\) 表示长度为 \(i\) 划分为 \(j\) 个长度不超过 \(k\) 的子段的方案数

    \(f[i][j]=f[i-1][j-1]+f[i-2][j-1]+\dots+f[i-k+1][j-1]\)

​ 这里再加上一个前缀和优化,为了方便编码,代码中的 \(i\) 和 \(j\) 是反过来的

最后对应长度相乘再累加统计答案即可。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL P=1e9+7;
const int MAXN=6005;
int n,k,a[MAXN],f[MAXN][MAXN],pre[MAXN][MAXN],sum[MAXN];
LL ans=0;
string s;
int main(){
    freopen("aqours.in","r",stdin);
    freopen("aqours.out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>k>>s;s=" "+s;
    for(int i=1;i<=n;i++)
        if(isalpha(s[i])) a[i]=s[i]-'a'+1;
        else a[i]=0;
    sum[0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            sum[j]=(1LL*sum[j]-f[j][a[i]]+P)%P;
            f[j][a[i]]=(1LL*sum[j-1]-f[j-1][a[i]]+P)%P;
            sum[j]=(1LL*sum[j]+f[j][a[i]])%P;
        }
    }
    memset(f,0,sizeof(f));
    f[0][0]=1;
    for(int i=0;i<=n;i++) pre[0][i]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            f[i][j]=((1LL*f[i][j]+pre[i-1][j-1])%P-(j-k-1<0 ? 0 : pre[i-1][j-k-1])+P)%P;
            pre[i][j]=(1LL*pre[i][j-1]+f[i][j])%P;
        }
    }
    for(int i=1;i<=n;i++){
        ans=(ans+1LL*f[i][n]*sum[i]%P)%P;
    }
    cout<<ans<<endl;
    return 0;
}

标签:字符,NOI,int,NFLS,真夏,MAXN,操作,序列,长度
From: https://www.cnblogs.com/SkyNet-PKN/p/18187340

相关文章

  • [NOI2009] 二叉查找树 & 笛卡尔树学习笔记
    这个题:二叉搜索树原理认识+区间dp;只要熟练相关算法就一定可以做出来。但我不行。。。我们学习一下笛卡尔树:什么垃圾东西,不学了。发现这个题是l蓝书上一道题jqb。二叉查找树又有一个性质:二叉查找树的中序遍历是其代表的序列从小到大排序的结果。而无论Treap如何旋转,其都......
  • #Trie#洛谷 6018 [Ynoi2010] Fusion tree
    题目给定一棵树,树上每个节点都有点权,需要实现三种操作,第一种是将与\(x\)相邻的所有节点点权加一,第二种是单点减小点权,第三种是查询与\(x\)相邻的所有节点点权的异或和分析相邻实际上就是父节点和子节点,不妨将其拆开考虑,需要解决单点查询单点修改的问题,考虑维护\(n\)......
  • NFLS NOI模拟 序列
    涉及知识点:数论,图论转化建图题意有一串长为\(n\(\leq10^3)\)序列\(a\),给出\(m\(\leq10^3)\)个条件,每条条件形如\(\gcd(a_i,a_j)=k\),问是否存在这样的序列满足所有条件。保证不存在重复的\((a_i,a_j)\)对。思路把题目给出的所有关系建成图,点\(i\)代表\(a_i\),\(\gc......
  • NFLS NOI模拟 Mizuki 与进化
    涉及知识点:贪心,疑似Ad_hoc题意给你一个只包含ABC的长度为\(2n\)的字符串,问能否将该字符串划分为\(n\)个子序列,子序列只能是ABACBC中的一个,或输出无解。思路设ABC的个数分别为\(a,b,c\),为ABACBC的子序列个数分别为\(cnt_{AB},cnt_{AC},cnt_{BC}\),那么有......
  • NFLS NOI模拟 大战波特
    涉及知识点:贪心前言思维难度不高,就是挺好玩的,随手记录下有意思的贪心,奇妙的贪心经常比复杂的DP还有意思。题意打Boss,总共可以打\(n\(\leq10^6)\)回合,每回合可以普攻一次,造成\(x\)点伤害,每回合可以使用咒语,总共最多使用\(k\)次,使得Boss赋予一层“中毒”效果,并减弱......
  • 洛谷 P1031 [NOIP2002 提高组] 均分纸牌 题解
    题目简述有$N$堆纸牌,编号分别为$1,2,\ldots,N$。每堆上有若干张,但纸牌总数必为$N$的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为$1$堆上取的纸牌,只能移到编号为$2$的堆上;在编号为$N$的堆上取的纸牌,只能移到编号为$N-1$的堆上;其他堆上取的纸牌,可......
  • 洛谷 P1012 [NOIP1998 提高组] 拼数 题解
    题目简述设有$n$个正整数$a_1\dotsa_n$,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。题目分析定义设$X$为数字$x$的字符串形式。$A+B$表示字符串$A$和字符串$B$相连组成的字符串。思路既然要构造最优解,显然如果有不优的情况的话,就需要对序列进行......
  • P3193 [HNOI2008] GT考试 题解
    之前学矩阵乘的时候做的题,当时因为不会\(kmp\)搜索一稀里糊涂过去了,现在填个坑。头图是\(Logos\)!P3193[HNOI2008]GT考试题链:洛谷题库题目大意:求有多少个长度为\(n\)的数字串的子串中不包含给出的长度为\(m\)位的串,范围\(n<=1e9\),$m<=20$。思路:首先考虑DP,令\(......
  • 初三下——NOIP 模拟赛(6~10)
    6ConclusionT1注意到一次碰撞后下一次一定不会碰到,一直这样直到出去。二分找位置即可然后算一下贡献。T2dp部分重排过后肯定是0+01+1的形式。于是根据这个dp。上面的dp冗余在其对于段数枚举了分界点。于是我们考虑就对于当前这个元素\(i\)进行单独考虑。记录是......
  • 洛谷P2375 [NOI2014] 动物园
    动物园题目描述输入格式输出格式输入输出样例输入3aaaaaababcababc输出36132开始时都没看出来这是kmp板子题先看看AC代码吧#include<bits/stdc++.h>#definelllonglongusingnamespacestd;constintmaxn=1e6+10;constintmod=1e9+7;chara[maxn];in......