题意:一个01信号串在经过某通道的时候会有如下几种可能的变化
(1)不变
(2)一个(仅一个)0变成1
(3)在某个位置删掉一个(仅一个)符号
(4)在某个位置增加一个(仅一个)符号
并且原信号串必须满足 符号为1的位置和 模 (len+1) 为 0。
例如1010,符号为1的位置有1和3,加起来等于4,模len+1=5的结果不是0,所以不可能是原信号串。
现在给原信号串的长度和变化后的信号串,求原信号串。
思路:模拟233333~
#include <cstdio>
#include <cstring>
#define N 1005
int n, len;
char w[N];
int pst[N], sym;
void lessthan()
{
for (int i = 0; i <= len; ++ i)
{
if ((sym+pst[i]) % (n+1) == 0)
{
for (int j = 0; j < i; ++ j) putchar(w[j]);
putchar('0');
printf("%s\n", w+i);
return;
}
if ((sym+pst[i]+i+1) % (n+1) == 0)
{
for (int j = 0; j < i; ++ j) putchar(w[j]);
putchar('1');
printf("%s\n", w+i);
return;
}
}
}
void morethan()
{
for (int i = 0; i <= len; ++ i)
{
if (w[i] == '1')
{
if ((sym-i-1-pst[i+1]) % (n+1) == 0)
{
for (int j = 0; j < i; ++ j) putchar(w[j]);
printf("%s\n", w+i+1);
return;
}
}
else
{
if ((sym-pst[i+1]) % (n+1) == 0)
{
for (int j = 0; j < i; ++ j) putchar(w[j]);
printf("%s\n", w+i+1);
return;
}
}
}
}
void equal()
{
for (int i = 0; i < len; ++ i)
{
if (w[i] == '1')
{
if ((sym-i-1) % (n+1) == 0)
{
w[i] = '0';
printf("%s\n", w);
return;
}
}
}
}
int main()
{
scanf("%d",&n);
while (scanf("%s",w) != EOF)
{
len = strlen(w);
for (int i = 0; i <= n; ++ i)
pst[i] = 0;
pst[len] = 0;
for (int i = len-1; i >= 0; -- i)
{
pst[i] = pst[i+1];
if (w[i] == '1') pst[i] ++;
}
sym = 0;
for (int i = 0; i < len; ++ i)
if (w[i] == '1') sym += i+1;
if (len < n) lessthan();
else if (len > n) morethan();
else
{
if (sym % (n+1) == 0) printf("%s\n", w);
else equal();
}
}
}