思路讲解
也是体验了一把学霸的感觉,一编译就本地AC,然后交上去就一次AC了。
比那个D题还要顺,只能说我的字符串哈希还是比较熟练的。
这个如果Hx里有比该前缀更小的单元,直接放弃。
1 | FOR(i,0,SZ(s)-1){ |
AC代码
https://atcoder.jp/contests/abc403/submissions/65404782
1 | // Problem: E - Forbidden Prefix |
也是体验了一把学霸的感觉,一编译就本地AC,然后交上去就一次AC了。
比那个D题还要顺,只能说我的字符串哈希还是比较熟练的。
这个如果Hx里有比该前缀更小的单元,直接放弃。
1 | FOR(i,0,SZ(s)-1){ |
https://atcoder.jp/contests/abc403/submissions/65404782
1 | // Problem: E - Forbidden Prefix |
这道题目,可以通过转化,变为给你一张链图,问你如何删去权重之和最少的点,使这张链图完全不联通。

这个问题可以通过dp解决。
1 | dp[0][0]=0,dp[0][1]=ls.front(); |
https://atcoder.jp/contests/abc403/submissions/65403420
1 | // Problem: D - Forbidden Difference |
WA,最后发现是循环范围出了问题
1 | // Problem: D - Forbidden Difference |
就是要注意到,如果一段连续的相同的数字是不会影响结果的,因此需要把他们缩减。
1 | // Problem: C. Neo's Escape |
https://codeforces.com/contest/2108/submission/317973413
1 | 1 |
首先贪心的,我们在每个位置上总归想跳的最远,且在每个位置上都跳的最远,得到的一定是最少跳跃次数的。
那么这个每个位置上通过加一个字母能够一次跳到的最远位置怎么得到的那?其实就是所有合法字母中上一次出现的位置最远的字母的位置(如果有一个合法字母前面没出现过,那我们就认为他直接跳出去结束了)。
1 | ROF(i,N-1,0){ |
然后知道了在这个位置上最远能跳多远,那么我们知道最多要跳多少次那?可以通过记忆化搜索。
1 | ll dfs(ll x){ |
最后这个串需要用多少位原串需要跳跃处理,否则会 TLE,最坏 O(NQ) 时间复杂度。
https://codeforces.com/contest/2104/submission/317799371
1 | // Problem: E. Unpleasant Strings |
https://codeforces.com/contest/2104/submission/317796467
对比对部分没有优化。
1 | // Problem: E. Unpleasant Strings |
其实思路还是很简单的,就是符合要求的一列数字,数字总和最小的就是 2,3,5,7,11,…
这样的一串素数数列。
证明?那么我们假设其中一个数字可以减去1,首先2不能-1(出现了1),那么其他的数字-1也不能(被2除)。
得证。
https://codeforces.com/contest/2104/submission/317754416
1 | // Problem: D. Array and GCD |