比赛传送门
E
记dp[i]为以i为起点的数组有几个好数组,如果i位置开始有一个块,那么可以状态转移(自己的块加上后面原有的好数组)注:k为a[i]
$$dp[i]=1+dp[i+k]
$$否则
$$dp[i]=0
$$最终答案就是dp数组的总和
接下来的问题就是如何快速判断i位置开始是否有一个块了:
预处理一个数组 s 其中s[i]表示从位置 i 开始,向右连续出现且值与 a[i]相同的元素所能到达的最远下标
从右往左扫描:
如果$a[i]==a[i+1]$ 那么$s[i]=s[i+1]$
否则$s[i]=i$
如果$i+k-1
2025-12-15623 字4 分钟
牛客周赛 Round 122(比赛记录)
比赛传送门
A
没什么好说的,打表根据 n 输出就行
Code
1234567void solve() { vector<char> a{'A','B','C','D','E','F','G','H','I','J','K','L','M'}; int n; cin >