timus_1007_代码字

题目要求:对于所有一个长度为N的字(这些字由0和1组成),在经过一条线路后,这些字可能会做如下的修改:

  1. 0可能变成1,但只能发生一次。

  2. 0或者1可能被去掉,但也只能发生一次。

  3. 0或者1可能被插入到字中,但也只能发生一次。

输入是字的长度n和经过线路后的字,求输入线路前的字。输入线路前的字的长度为n,字中1的位置之和要么是n+1的倍数,要么是0。如字1001,字长为4,其中1的位置之和为1+4=5,所以满足字中1的位置之和为4+1的倍数。

样例输入:

  4

  0000

  011

  1011

  11011

样例输出:

  0000

  0110

  1001

  1111

  这道题其实有点歧义,一种理解是字在通过线路后只能被三种可能中的一种修改,另一种理解是可以被三种中的一种,两种或者三种同时修改。

  如果是第一种情况,题目就很简单了,只要根据输入字的的长度,就可以判断字是由三种情况的哪种改变的。

  情况1:如果字的长度为n,说明是被第一种情况改变的。首先计算字中1的位置之和sum,然后便可以知道被1取代的0的位置是sum%(n+1)。当然如果sum%(n+1)==0,说明字根本就没有改变;

  情况2:如果字的长度是n-1,说明是被第二种情况改变的。试探性地将0或者1插入到字的第一个或者第二个....或者第n个位置,从而得到长度为n的字。计算这时字中1的位置之和sum,如果sum%(n+1)为0,则这个字就是我们要的字。

  情况3:如果字的长度是n+1,说明是被第三种情况改变的。试探性地将字的第一个或者第二个....或者第n个位置的数字删除,得到长度为n的字。计算这时字中1的位置之和sum,如果sum%(n+1)为0,则这个字就是我们要的字。

  通过这种方法提交,结果是AC。不过感觉题目应该不是这个意思,也许是测试数据太简单了吧。

  如果是第二种情况,要比第一种复杂一些。也是根据输入字的长度来分三种情况:

  情况1:如果字的长度是n-1,说明一定是被第二种情况改变的过的,当然有可能也被第一种情况改变过,一定不可能被第三种情况改变过。试探性地将0或者1插入到字的第一个或者第二个....或者第n个位置,从而得到长度为n的字。计算这时字中1的位置之和sum,如果sum%(n+1)为0,则这个字就是我们要的字。如果不为0,而且字在sum%(n+1)的位置是1,那么这就变成了第一种理解的情况1,只要把位置sum%(n+1)的1改变成0就可以得到我们想要的字。

  情况2:如果字的长度是n+1,说明是被第三种情况改变的,当然有可能也被第一种情况改变过,一定不可能被第三种情况改变过。试探性地将字的第一个或者第二个....或者第n个位置的数字删除,得到长度为n的字。计算这时字中1的位置之和sum,如果sum%(n+1)为0,则这个字就是我们要的字。和情况1一样,如果不为0,而且字在sum%(n+1)的位置是1,只要把位置sum%(n+1)的1改变成0就可以得到我们想要的字。

  情况3:如果字的长度为n,又要分三种情况:

  • 这种情况就是第一种理解的情况1。
  • 试探性的删除字中的一位(这一位可以是在位置1,2...n),然后就变成情况1了。
  • 试探性的向字中插入一位(这一位可以是在位置1,2...n+1),然后就变成情况2了。

  不过用这种理解写的代码去提交,结果是WA。所以感觉这道题目做的真实没意思,不知道是不是我理解错了题目的意思,反正discuss里面讨论了很多。

  附件:源代码

原文地址:https://www.cnblogs.com/chengxuyuancc/p/3152582.html