ural 1007 Code Words

本文介绍了一种针对01信号串变化的模拟算法,包括信号串可能发生的四种变化情况及其验证方法。通过分析信号串长度变化及内部1的位置分布,实现原信号串的有效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:一个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();
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值