Codeforces Round #110 (Div. 2)

Codeforces Round #110 (Div. 2)

C. Message

题意

  • 给两个长度不超过2000的字符串(s,u),仅由小写字母构成。
  • 找出(s)的一个子串(t),通过3种操作变换成字符串(u):
  1. 在首或尾添加一个字符;
  2. 删除首或尾的一个字符;
  3. 改变某个位置的字符。
  • 求最小的操作步数。

思路

  • 因为删除、插入的代价和修改的代价一样,显然找出和(u)长度一样的子串(t)可以求得最小代价。
  • 显然(u)可以只匹配(s)的一个前缀或后缀,可以通过在(s)首或尾添加非字母字符。

代码


D. Suspects

题意

  • (N(N le 10^5))个嫌疑人,其中一个是凶手。
  • 每个人会有一个回答((+a_i或-a_i)),分别表示(i)认为(a_i)是凶手和不是凶手。
  • 已知全部回答中只有(m)个回答是真的,其余都是假的。
  • 对于每个回答,判定嫌疑人是否在说谎,输出(Truth)(Lie),如果无法判断,则输出(Not defined)

思路

  • 判断一个人是否是凶手:统计认为(i)是凶手的数量(c[i]),以及认为(i)不是凶手的数量(nc[i]),则为真的回答数=$$c[i]-nc[i]+sum_{j=1}^{n}{nc[j]}$$
  • 假定(i)是凶手,则([1, i))((i, n])的人不是凶手。维护(L)的最大值,(R)的最小值,使得([1, L))((R, n])的人不是凶手。
  • (a_i)可能是凶手,也可能不是凶手时,就无法判断嫌疑人的回答是否撒谎。

代码


E. Cipher

题意

  • 给长度不超过100的字符串(s)
  • 有两种操作,每次操作选择一个位置(p(1 le p lt |s|))
  1. (++s_p, --s_{p+1})
  2. (--s_p, ++s_{p+1})
  • 经过若干次操作,变成了串(t),求不同的串(t)的数量。

思路

  • 认真想一下的话,可以发现串的总和是不变的,两种操作想当于把1扔到相邻的位置上。
  • 那么用(f[i][j])表示i个字符组成和为j的方案数即可。

代码

原文地址:https://www.cnblogs.com/mcginn/p/5901443.html